【问题标题】:How is TabItem used when placed in the layout XML?TabItem 放置在布局 XML 中时如何使用?
【发布时间】:2016-10-28 08:18:54
【问题描述】:

TabLayout documentation 给出了一个将TabItem 直接嵌套在TabLayout 中的示例,如下所示:

<android.support.design.widget.TabLayout
     android:layout_height="wrap_content"
     android:layout_width="match_parent">

    <android.support.design.widget.TabItem
         android:text="@string/tab_text"/>

    <android.support.design.widget.TabItem
         android:icon="@drawable/ic_android"/>

</android.support.design.widget.TabLayout>

但它没有给出如何在实践中使用它的示例,并且 TabItem 的文档说:

这个视图实际上并没有添加到 TabLayout,它只是一个允许设置选项卡项的文本、图标和自定义布局的虚拟视图。

那么TabItem 是干什么用的?经过广泛的谷歌搜索,我找不到任何人在 XML 中定义 TabItems 的单个示例。有没有办法在资源文件中使用 TabItem 设置选项卡式活动,如上所示?

【问题讨论】:

    标签: android android-layout android-tabs android-tablayout


    【解决方案1】:

    这似乎是对设计库的较新添加,显然是在 23.2.0 版中添加的,尽管在 the revision history 中没有提及。它的功能非常基本,它似乎使用的唯一属性是docs 中给出的三个属性:texticonlayout

    从测试来看,它似乎基本上是一种 XML 快捷方式,用于创建新的 Tab,并设置其文本、图标和自定义 View,就像通常在代码中所做的那样。当它说“这个视图实际上并没有添加到 TabLayout”时,我相信这意味着它不是常规意义上的 View,因为你不能在它上面设置任何类型的标准布局属性,比如 @ 987654329@ 或background。它只是用于使TabLayout 为每个TabItem 创建一个新的Tab,并相应地调用setText()setIcon()setCustomView()

    例如,要在代码中添加Tab,我们通常会这样做:

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
    
    // Add Tab
    TabLayout.Tab tab = tabLayout.newTab();
    
    tab.setCustomView(R.layout.tab);
    tab.setText("Tab 1");
    tab.setIcon(R.drawable.ic_launcher);
    
    tabLayout.addTab(tab);
    

    而现在我们可以通过在布局中添加TabItem 来替换上述评论之后的所有内容。

    <android.support.design.widget.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <android.support.design.widget.TabItem
            android:layout="@layout/tab"
            android:text="Tab 1"
            android:icon="@drawable/ic_launcher" />
    
    </android.support.design.widget.TabLayout>
    

    请注意,自定义 View 布局的相同要求仍然适用。也就是说,文本的TextView 必须具有系统资源ID @android:id/text1,而图标的ImageView 必须具有ID @android:id/icon。例如,上面的R.layout.tab

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_vertical">
    
        <ImageView android:id="@android:id/icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
        <TextView android:id="@android:id/text1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
    </LinearLayout>
    

    【讨论】:

    • 是的,没错。这就是为什么TextViewImageView 需要有这些特定的ID。如果您曾经在 Tabs 上设置过自定义 Views,那么它在代码中也是如此。
    • 嗯,带有ViewPager 我想你必须自己处理设置,因为我相信TabLayout 不能使用自定义View self -填充其Tabs,然后自动从PagerAdapter 中提取文本。可能有一些可口的方式来做到这一点,但我得考虑一下。
    • 有 ViewPager 的替代品吗? TabItem 有什么实际应用?
    • 我的意思几乎是你想要的。它基本上是一个美化的RadioGroup。如果你想用它来换出Views,你可以用它来控制ViewFlipperViewSwitcher,但那些没有内置滑动。或者你可以做基本的View操作,用ViewGroup#addView()removeView()。或者您可以执行自己的FragmentTransactions,但同样,除非您实现它,否则不要滑动。
    • 这是我能找到的唯一一篇提到TabItem 并使用android:layout 参数的帖子。在哪里可以找到布局 xml 文件的更大示例?
    【解决方案2】:

    快速添加到@Mikes 非常有用的答案:

    Android Studio 现在有一个模板,介绍如何在 XML 布局中使用 TabLayoutTabItem 设置。使用 "New > Activity > Tabbed Activity" 创建所有需要的文件,然后选择 "Action Bar Tabs(with ViewPager)" 如屏幕截图所示:

    如果您想在不使用自定义视图的情况下调整 TabItem 的外观:使用 白色矢量资源 作为标签 android:icon 并使用选择器着色它们(根据android:state_selected提供不同的颜色)

    在标签TabLayout上将当前选中标签下的线条颜色设置为app:tabIndicatorColor

    我花了一段时间才让它工作,所以完整的步骤变成了一个很长的答案,我不想在这里复制它们。您可以在以下位置找到我更详细的完整代码答案:

    https://stackoverflow.com/a/49603559/414581

    【讨论】:

    • 您似乎不能再选择“导航样式”了。当前模板不包含“TabItem”。我一直在寻找如何使用它的几个小时,因为我希望我可以将我的片段放入 TabItems 并在没有任何适配器的情况下做到这一点......:/
    【解决方案3】:

    请参阅 com.google.android.material.tabs.TabItem 类,它接受来自属性的图标文本,但您似乎需要在运行时添加标签。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-30
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多