我已经为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。希望这对某些人有所帮助。
标签没有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}")
}
显然,这有点像黑客。但这有效,并且似乎也可以在进程死亡中幸存下来。