如何自定义Android ActionBar以在标签之前显示自定义视图?

时间:2012-03-11 03:07:20

标签: android android-actionbar

我正在使用Tabs的ActionBar自定义视图。我的问题是自定义视图的排序。 Android正在显示 AFTER 标签 - 这是我不想要的。

我希望自定义视图显示 BEFORE 标签。

有没有办法自定义actionBar以在标签之前显示自定义视图?或者这不可能吗?

代码:

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);    
}

enter image description here

7 个答案:

答案 0 :(得分:3)

这似乎是使用制表符和自定义视图时的预期行为。 https://code.google.com/p/android/issues/detail?id=36191#c3

如果你看看ActionBarSherlock - Tabs appearing ABOVE actionbar with custom view,许多其他人也会遇到这种情况,有些人提供了解决方案。

我无法让任何解决方案正常工作,但它们可能适合您。诀窍似乎是要确保徽标未设置为隐藏。呼叫
    如果使用ActionBarSherlock,则getActionBar().setDisplayShowHomeEnabled(true)getSupportActionBar().setDisplayShowHomeEnabled(true)

然后致电:

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);

这将获取对保存徽标的操作栏视图的引用,并将其设置为已启用,使自定义视图能够填充整个父视图,但应将选项卡保留在下面...

正如我所说,我无法实现这一目标,但有些人已经取得了成功。

祝你好运。

答案 1 :(得分:2)

我遇到了同样的问题,我找到了解决问题的方法。 这不是一个“优雅”的解决方案,但它是我能找到的最好的解决方案。 首先,因为您要修改标准的ActionBar行为,所以必须强制ActionBar Sherlok始终使用非本机实现。 要做到这一点,打开ActionBarSherlok.java并注释这行代码:

registerImplementation(ActionBarSherlockNative.class);

然后删除所有值-v11 values-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);
    }

你已经完成了! 希望这有帮助

答案 2 :(得分:0)

将自定义视图添加到ActionBar时,您也可以指定重力。

ActionBar.LayoutParams lp = new ActionBar.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);              
lp.gravity = Gravity.LEFT;
customView.setLayoutParams(lp);

答案 3 :(得分:0)

使用ActionBarSherlock,这是所有Android版本的自定义ActionBar的非常好的实现,非常容易使用。

或者你可以使用自定义标题栏创建自己的ActionBar,并且它足够容易实现。您可以看到thisthis示例是自定义标题栏的非常好的示例。

答案 4 :(得分:0)

您是否在为平板电脑制作应用?据我所知,动作栏的标签栏基本上出现在手机的下方。
如果在平板电脑上,我担心你无法调整标签的位置。我能想到的是你需要使用导航模式退出并创建一个自定义视图,它看起来像选项卡来替换actionBar选项卡。当然,这会导致很多额外的工作来处理导航内容。

答案 5 :(得分:0)

只需为主页按钮创建自定义视图即可。在此视图中,您可以将徽标和您尝试在左侧定位的自定义视图结合使用。然后正常添加标签

此解决方案的唯一缺点是您需要自己维护后退按钮的状态(如果您根本使用它)

答案 6 :(得分:0)

首先设置&#34; DisplayShowHomeEnabled&#34;动作栏的属性为&#34; true&#34;:         actionBar.setDisplayShowHomeEnabled(真);

然后:

    View homeIcon = findViewById(android.R.id.home);
        ((View) homeIcon.getParent()).setVisibility(View.GONE);
        ((View) homeIcon).setVisibility(View.GONE);

我希望它有所帮助:)