操作栏选项卡被分成了堆叠的形式,即使在主操作栏上有足够的空间。

3
我正在尝试让选项卡显示在主操作栏上,就像Android开发者网站上展示的那样。
我编写了以下基本代码:

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

}

但它显示的是这样的(选项卡被拆分成一个堆叠的操作栏):
网站说明:
“…系统会根据不同的屏幕尺寸调整操作栏选项卡——当屏幕足够宽时,将它们放在主操作栏中;当屏幕太窄时,将它们放在单独的栏中(称为“堆叠操作栏”),如图9和10所示。”
我认为屏幕足够宽,可以将整个操作栏放在主操作栏上。我甚至尝试只定义一个选项卡,但它仍然有自己的堆叠栏。
我有API演示文稿,但我还没有找到他们提到的“Honeycomb Gallery”示例,以便我可以查看他们的代码。
我还尝试将ActionBar导航模式设置为STANDARD和LIST,但没有成功。

当您将屏幕旋转到横向时,它是否能正常工作? - Stephane Mathis
@StephaneMathis 是的,在横屏模式下它可以工作。那么,这给你提供了什么线索吗? - ilomambo
我认为这只是因为Android认为在手机竖屏时在ActionBar中显示选项卡不是一个好主意。这样做是为了节省屏幕空间,但是在一个高度比宽度更大的屏幕上节省垂直空间是无用的。 - Stephane Mathis
如果您希望始终在操作栏中使用选项卡,可以通过在操作栏中放置自定义视图并自行管理所有内容来强制实现您想要的效果。 - Stephane Mathis
文档上说“足够宽”,所以他们可以做他们想做的事情。你可以使用一个带有片段的ViewPager,ViewPagerIndicator库(http://viewpagerindicator.com/)。那会是很多工作。 - Stephane Mathis
显示剩余2条评论
2个回答

0

现在有一种相当简单(或者说不那么hackish)的方法。您需要使用appcompat-v7和design库(版本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和其他任何你想要的东西放在上面,然后将其作为自定义视图传递。


0

看起来,操作栏选项卡策略在去年发生了变化,始终将所有屏幕大小的选项卡在纵向模式下堆叠(即使它可能适合操作栏)。这似乎没有得到很好的记录(或者根本没有记录),我找不到任何记录。我可以确认,如果目标API版本为JB,则此新策略肯定适用于JB设备。

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

源代码树中ActionBar选项卡策略提交注释

操作栏选项卡现在在所有屏幕大小的纵向模式下堆叠,而不是嵌入显示。这仅影响目标SDK版本为JB或更高版本的应用程序,因为旧应用程序可能无法准备好操作栏的不同测量或具有适当的堆叠栏背景可绘制对象。

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

如果您必须在纵向模式下将选项卡嵌入操作栏中,那么似乎您必须将目标API版本设置为低于JB(这意味着应用程序无法使用任何JB或更高版本的API),或者无论选项卡所需宽度如何,在任何设备上纵向模式下都只能使用堆叠布局作为唯一选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接