【问题标题】:ActionBar tabs are split stacked, even when there is enough space on the main bar即使主栏上有足够的空间,ActionBar 选项卡也会拆分堆叠
【发布时间】:2013-07-03 08:00:18
【问题描述】:

我正在尝试让选项卡出现在主操作栏上,就像它们在 the Android Developers site 上显示的那样

我写了这个基本代码:

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

}

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

网站声明:

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

我认为屏幕足够宽,可以将整个操作栏放在主栏上。我尝试只定义一个选项卡,但它仍然有自己的堆叠条。
我有 API Demos,但我找不到他们提到的“Honeycomb Gallery”示例,所以我可以检查他们的代码。
我也尝试将 ActionBar 导航模式设置为 STANDARD 和 LIST,但无济于事。

【问题讨论】:

  • 将屏幕旋转到横向时是否有效?
  • @StephaneMathis 是的,在横向模式下它可以工作。那么,它是否让您知道发生了什么?
  • 我认为这只是Android认为在ActionBar中以纵向显示手机标签不是一个好主意。这样做是为了节省屏幕空间,但是在比宽屏幕更高的地方节省垂直空间是没有用的。
  • 如果您总是想在 ActionBar 中设置标签,您可以通过在操作栏中放置自定义视图并自己管理所有内容来强制执行您想要的操作。
  • @StephaneMathis 一方面,您对 Android 的看法可能是正确的。另一方面,文档并没有说明在纵向模式下 ActionBar 规则会发生变化。我开始搜索自定义视图,这意味着我将不得不复制 TAB 的外观并模仿选项卡的行为,由于实现错误,我不喜欢做这么多工作(是的,当规范说时我称之为错误它应该适合主 ActionBar,但它不适合)。最后,什么是无用的,什么是无用的,取决于要编程的应用程序,你不能预先假设它。

标签: android android-actionbar


【解决方案1】:

操作栏选项卡政策似乎在去年更改为始终以纵向模式堆叠所有屏幕尺寸的选项卡(在下意识为什么它对他们起作用之前,请进一步阅读!)即使它可能适合操作栏。这似乎没有很好的记录(或我能找到的所有记录)。如果目标 API 版本是 JB,我可以确认这个新策略肯定会应用于 JB 设备。

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

ActionBar tabs policy commit comments in source tree

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

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

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

【讨论】:

    【解决方案2】:

    现在有一种相当简单(嗯,不那么老套)的方法。您需要使用 appcompat-v7 和设计库(版本 22.0+)。我假设您使用ViewPager 作为选项卡内容(如果没有,只需在下面的代码中省略与ViewPager 相关的内容,并将其替换为您自己的选项卡切换逻辑)。让您的活动扩展AppCompatActivity(它同时支持ActionBar 和内置ViewPager 功能),然后在其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 和任何你想要的东西,并将它作为自定义视图传递.

    【讨论】:

      猜你喜欢
      • 2013-02-05
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多