如何自定义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); 

我希望它有助于:)