Android ActionBar导航标签在手机和平​​板电脑中看起来不同

Abd*_*aib 5 android android-actionbar

ActionBar导航标签是否可以在手机和平​​板电脑上显示相同的内容?

查看下面的手机和平板电脑图片:

电话: 电话图片

片剂: 片剂

Android 文档说明"......当屏幕足够宽时,标签会出现在操作栏旁边的动作按钮......".我们不希望它们出现在ActionBar中.有解决方案吗

adn*_*eal 6

ActionBar标签被创建ScrollingTabContainerView.的ActionBarView,实际ViewActionBar,包含一个方法ActionBarView.setEmbeddedTabView是用于突片下面或者嵌入在的位置基本上负责ActionBar.

ActionBar初始化的Activity,它使用ActionBarPolicy来确定何时使用基于一个嵌入式标签boolean是已定义的值true在系统的资源,但false在肖像模式.因此,在ActionBarImpl.setHasEmbeddedTabs调用此初始化时,将确定放置选项卡的位置.而且,正如文档所述:

...当屏幕足够宽时,标签会出现在动作按钮旁边的动作栏中

那么如何阻止它嵌入标签呢?

看起来你在这里有两个选择,其中一个显然,至少对我来说,比另一个更好.

  1. 您可以使用反射来调用ActionBarImpl.setHasEmbeddedTabs并将其设置为始终false.您需要使用反射,因为它ActionBarImpl是一个内部类,并且没有公共ActionBar方法来指示何时嵌入选项卡.

  2. 您可以停止使用ActionBar.TabAPI并切换到替代方案,例如GoogleSlidingTabLayout.这个将要求你使用a ViewPager,这通常是一个很好的加号,无论如何使用标签,你甚至可能已经在使用它.

以下是两个示例:

用反射

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    final ActionBar actionBar = getActionBar();
    // Implement your tabs
    ...
    try {
        final Class<?> clazz = actionBar.getClass();
        final Method embedTabs = clazz.getDeclaredMethod("setHasEmbeddedTabs", boolean.class);
        embedTabs.invoke(actionBar, false);
    } catch (final Exception ignored) {
        // Nothing to do
    }
}
Run Code Online (Sandbox Code Playgroud)

反思结果

例

从固定选项卡切换到可滚动选项卡

要使用Google SlidingTabLayout,您需要将两个类复制到项目中.你需要的课程是:

实现the的示例布局SlidingTabLayout看起来像这样:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical">

    <your_path_to.SlidingTabLayout
          android:id="@+id/slidingTabs"
          android:layout_width="match_parent"
          android:layout_height="wrap_content" />

    <android.support.v4.view.ViewPager
          android:id="@+id/viewPager"
          android:layout_width="match_parent"
          android:layout_height="0dp"
          android:layout_weight="1" />

</LinearLayout> 
Run Code Online (Sandbox Code Playgroud)

在膨胀布局并初始化SlidingTabLayout使用之后View.findViewById,您调用SlidingTabLayout.setViewPager绑定ViewPager到选项卡.

查看Google的完整项目示例

可滚动选项卡结果

可滚动标签用于Google的多个应用中,例如Play商店和Play音乐.有关演示它们的简短视频,如果您不熟悉,请查看选项卡上的Android设计文档.

结论

简而言之,如果您不希望嵌入它们,我建议使用可滚动选项卡而不是固定选项卡(至少在横向模式下).

  • 谢谢你的回答. (2认同)