如何在Android中以编程方式获取TabItem ID

问题描述 投票:0回答:1

我已经为XML的TabLayout中的所有TabItem定义了ID,但是无法以编程方式获取ID。 我知道我可以通过使用position参数来达到相同的目的,但是我不需要。任何帮助表示赞赏。

XML

   <android.support.design.widget.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:tabSelectedTextColor="@color/white"
        app:tabTextColor="@color/unselected_tab">

        <android.support.design.widget.TabItem
            android:id="@+id/live_tab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Live" />

        <android.support.design.widget.TabItem
            android:id="@+id/upcoming_tab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Upcoming" />

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

科特琳:

        override fun onTabSelected(tab: TabLayout.Tab) {
            when (tab.id) { //tab.id is not available
                R.id.live_tab -> showFragment(LiveFragment())
                R.id.upcoming_tab -> showFragment(UpcomingFragment())
            }
        }

更新:根据Mike M的说法,制表符没有ID。您在布局中指定的id属性将被忽略。 TabItem仅支持文本,图标,布局和contentDescription。希望这对某些人有所帮助。

android kotlin android-tablayout
1个回答
0
投票

标签没有ID。您在布局中指定的id属性将被忽略。 TabItem仅支持文本,图标,布局和contentDescription。

@@ Sai和@MikeM。是正确的。 TabLayout.Tab没有ID。

但是,让我介绍一个可能的解决方法。我们将使用contentDescription作为我们的标识符。

res/values/中使用任何名称(例如tab_identifiers.xml)创建资源文件,并在其中添加一些标识符。

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- MEDIA PAGE TABS -->
    <string name="tab_import_media">ImportMedia</string>
    <string name="tab_play_media">PlayMedia</string>
    <string name="tab_mux_media">Muxer</string>
</resources>

您还可以使用真实的内容描述,毕竟此文件只是字符串资源的守护者。

现在,在您的活动/片段XML中,将这些字符串添加为contentDescription,如下所示:

<com.google.android.material.tabs.TabLayout
    android:id="@+id/media_tab_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <com.google.android.material.tabs.TabItem
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@string/tab_import_media"
        android:icon="@mipmap/ic_launcher" />

    <com.google.android.material.tabs.TabItem
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@string/tab_play_media"
        android:icon="@mipmap/ic_launcher" />

    <com.google.android.material.tabs.TabItem
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@string/tab_mux_media"
        android:icon="@mipmap/ic_launcher" />

</com.google.android.material.tabs.TabLayout>

现在,您可以通过TabItem轻松识别所有contentDescription。在您的TabLayout.OnTabSelectedListener#onTabSelected(TabLayout.Tab)中,执行以下操作:

override fun onTabSelected(tab: TabLayout.Tab?) {
    Log.d("MediaFragment", "selectedTab = ${tab?.contentDescription}")
}

显然,这有点像黑客。但这有效,并且似乎也可以在进程死亡中幸存下来。

© www.soinside.com 2019 - 2024. All rights reserved.