即使主条上有足够的空间,ActionBar选项卡也会分开堆叠

时间:2013-07-05 09:06:58

标签: android android-actionbar

我正在尝试将Tabs放在主要的ActionBar上,就像它们显示在the Android Developers site上一样

enter image description here

我写了这个基本代码:

package com.example.test;

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.Menu;

public class MainActivity extends Activity implements ActionBar.TabListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Set up the action bar.
        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        Tab tab = actionBar.newTab().setTabListener(this).setText("TAB LEFT");
        actionBar.addTab(tab);

        tab = actionBar.newTab().setTabListener(this).setText("TAB CENTER");
        actionBar.addTab(tab);

        tab = actionBar.newTab().setTabListener(this).setText("TAB RIGHT");
        actionBar.addTab(tab);

        actionBar.setDisplayShowHomeEnabled(false);
        actionBar.setDisplayShowTitleEnabled(false);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
         // Inflate the menu; this adds items to the action bar if it is present.
         getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {}
    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {}
    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {}

}

但它显示了这一点(标签被拆分为堆叠的操作栏):

enter image description here

该网站声明:

  

...系统会根据不同的屏幕调整操作栏选项卡   尺寸 - 在屏幕显示时将它们放置在主操作栏中   足够宽,或在单独的栏中(称为“堆叠动作”   栏“)当屏幕太窄时,如图9和图10所示。

我认为屏幕足够宽,可以将整个操作栏放在主栏上。我的活动尝试只定义一个标签,但它仍然有自己的堆叠条 我有API演示,但我无法找到他们提到的“Honeycomb Gallery”样本,因此我可以检查他们的代码。
我还尝试将ActionBar导航模式设置为STANDARD和LIST,但无济于事。

2 个答案:

答案 0 :(得分:0)

看来行动栏选项卡政策去年改为始终以纵向模式堆叠所有屏幕尺寸的标签(在一个膝盖抖动之前为什么它正在为他们工作,请进一步阅读!)即使它可能适合行动吧。这似乎没有得到很好的记录(或者我可以找到的所有记录)。如果目标API版本是JB,我可以确认这个新策略肯定在JB设备中应用。

在源代码树的提交说明中找到了这个

ActionBar tabs policy commit comments in source tree

  

操作栏标签现在以纵向模式叠加在所有屏幕尺寸上   比显示嵌入式。这仅影响具有targetSdkVersion的应用   JB或更高版本,因为旧的应用程序可能没有为不同的应用程序做好准备   测量条形或具有适当的堆叠条形背景   绘制。

     

堆叠的操作栏标签现在有宽度限制。这可以防止   超宽的标签,可以跨越整个屏幕。选项卡群集   如果它没有跨越整个宽度,则居中。

因此,如果您必须在操作栏中嵌入标签,当它适合纵向模式时,则表明您必须使目标API版本低于JB(这意味着该应用程序不能使用任何JB或更高版本的API )或处理堆叠布局作为纵向模式在任何设备上的唯一选项,无论选项卡所需的宽度如何。

答案 1 :(得分:0)

现在有一种相当简单(好,不那么强硬)的方式。您需要使用appcompat-v7和设计库(版本22.0+)。我假设您使用ViewPager作为标签内容(如果没有,只需在下面的代码中省略ViewPager - 相关内容,并将其替换为您自己的标签切换逻辑)。让您的活动延长AppCompatActivity(它同时包含支持ActionBarViewPager功能),然后在其onCreate()方法中执行以下操作:

    ActionBar actionBar = getSupportActionBar();

    setContentView(R.layout.activity_main);

    // Create the adapter that will return a fragment for each of the three
    // primary sections of the app.
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    Context ctx = new ContextThemeWrapper(getApplication(), R.style.AppTheme);
    mTabLayout = new TabLayout(ctx);
    LinearLayout.LayoutParams mTabLayoutParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
    mTabLayout.setLayoutParams(mTabLayoutParams);

    for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
        TabLayout.Tab newTab = mTabLayout.newTab();
        // Assuming you use icons on tabs (text should work, too)
        newTab.setIcon(mSectionsPagerAdapter.getPageIcon(i));
        mTabLayout.addTab(newTab);
    }

    actionBar.setDisplayShowCustomEnabled(true);
    actionBar.setCustomView(mTabLayout);

    // This will keep tabs and the ViewPager in sync
    // (selecting a tab will switch pages, swiping will update tabs)
    mTabLayout.setOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
    mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout));

这可以通过实例化TabLayout()并将其作为自定义视图添加到ActionBar来实现。

据我所知,这将隐藏应用程序图标和标题。如果您确定需要它们,我还没想出如何展示它们,但我想您总是可以创建LinearLayout,删除TabLayout以及您想要的任何其他内容,然后通过作为自定义视图。