如何自定义Android ActionBar在标签之前显示自定义视图?
我正在使用选项卡的ActionBar自定义视图。 我的问题是自定义视图的顺序。 Android 之后显示标签 – 我不想要的。
我想在选项卡之前显示自定义视图。
有没有一种方法来自定义的动作条在标签之前显示自定义视图? 或者这是不可能的?
码:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final ActionBar bar = getActionBar(); bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); View customActionBarView = getLayoutInflater().inflate(R.layout.home_actionbar, null, true); ActionBar.LayoutParams lp = new ActionBar.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); lp.gravity = Gravity.START; bar.setCustomView(customActionBarView, lp); bar.setLogo(R.drawable.logo); bar.setHomeButtonEnabled(true); bar.setDisplayShowCustomEnabled(true); bar.addTab(bar.newTab() .setText("Stuff") .setTabListener(new TabListener<StuffFragment>( this, "stuff", StuffFragment.class))); bar.addTab(bar.newTab() .setText("Friends") .setTabListener(new TabListener<ContactsFragment>( this, "friends", ContactsFragment.class))); bar.addTab(bar.newTab() .setText("Messages") .setTabListener(new TabListener<ConversationsFragment>( this, "messages", ConversationsFragment.class))); if (savedInstanceState != null) { bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); } bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_USE_LOGO); bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); }
这似乎是使用制表符和自定义视图时的预期行为。 https://code.google.com/p/android/issues/detail?id=36191#c3
如果你看看ActionBarSherlock – 标签出现在自定义视图ABOVE行动栏许多其他人也遇到这一点,有些人提供了解决scheme。
我一直无法得到任何解决scheme的工作,但他们可能会为你工作。 诀窍似乎是确保徽标不被设置为隐藏。 呼叫
getActionBar().setDisplayShowHomeEnabled(true)
或getSupportActionBar().setDisplayShowHomeEnabled(true)
如果使用ActionBarSherlock。
然后打电话:
View homeIcon = findViewById( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? android.R.id.home : R.id.abs__home); ((View) homeIcon.getParent()).setVisibility(View.GONE); ((View) homeIcon).setVisibility(View.GONE);
这将得到一个引用的工具栏视图,其中包含徽标,并将其设置为使自定义视图填充整个父视图,但应保持在下面的标签…
正如我所说我无法得到这个工作,但有些人已经取得成功。
祝你好运。
我有同样的问题,我想出了一个办法来解决这个问题。 这不是一个“优雅”的解决scheme,但它是我能find的最好的。 作为你想要修改标准ActionBar行为的第一件事,你必须强制ActionBar Sherlok总是使用非本地实现。 要做到这一点打开ActionBarSherlok.java并注释下面这行代码:
registerImplementation(ActionBarSherlockNative.class);
然后删除所有值-V11值-V14等,一定要始终扩展Theme.Sherlock,永远不Theme.Holo
在这一点上,你确定ActionBar的实现总是由Jake Wharton写的。 剩下的唯一要做的就是按照你想要的方式布置ActionBar视图。 打开ActionBarView.java并在onLayout()方法中移动这段代码
if (mExpandedActionView == null) { final boolean showTitle = mTitleLayout != null && mTitleLayout.getVisibility() != GONE && (mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0; if (showTitle) { x += positionChild(mTitleLayout, x, y, contentHeight); } switch (mNavigationMode) { case ActionBar.NAVIGATION_MODE_STANDARD: break; case ActionBar.NAVIGATION_MODE_LIST: if (mListNavLayout != null) { if (showTitle) x += mItemPadding; x += positionChild(mListNavLayout, x, y, contentHeight) + mItemPadding; } break; case ActionBar.NAVIGATION_MODE_TABS: if (mTabScrollView != null) { if (showTitle) x += mItemPadding; x += positionChild(mTabScrollView, x, y, contentHeight) + mItemPadding; } break; } }
在这件作品之前
if (mProgressView != null) { mProgressView.bringToFront(); final int halfProgressHeight = mProgressView.getMeasuredHeight() / 2; mProgressView.layout(mProgressBarPadding, -halfProgressHeight, mProgressBarPadding + mProgressView.getMeasuredWidth(), halfProgressHeight); }
你完成了! 希望这可以帮助
当您将自定义视图添加到ActionBar时,您也可以指定重力。
ActionBar.LayoutParams lp = new ActionBar.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); lp.gravity = Gravity.LEFT; customView.setLayoutParams(lp);
使用ActionBarSherlock ,这是非常好的实现自定义ActionBar的所有Android版本,非常容易使用。
或者你可以使用自定义标题栏创build自己的ActionBar,而且它的公平性很容易实现。 你可以看到这个 , 这个例子是自定义标题栏的很好的例子。
你正在为平板电脑开发一个应用程序吗? 据我所知,动作栏的标签栏基本上出现在手机下面。
如果在平板电脑上,恐怕无法调整标签的位置。 我能想到的是,你需要退出使用导航模式,并使自定义视图看起来像选项卡来replaceactionBar选项卡。 当然这会导致很多额外的努力来处理导航的东西。
只需为您的主页button创build一个自定义视图。 在此视图中,您可以将徽标和您要放置在左侧的自定义视图组合在一起。 然后像平常一样添加标签
这个解决scheme唯一的缺点就是你需要自己维护后退button的状态(如果你使用的话)
首先将操作栏的“DisplayShowHomeEnabled”属性设置为“true”:actionBar.setDisplayShowHomeEnabled(true);
接着:
View homeIcon = findViewById(android.R.id.home); ((View) homeIcon.getParent()).setVisibility(View.GONE); ((View) homeIcon).setVisibility(View.GONE);
我希望它有助于:)