Как используется TabItem при размещении в XML-макете?

Документация TabLayout дает пример вложения 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 ? После обширного Googling я не могу найти ни одного примера любого, кто определяет TabItems в XML. Есть ли способ настроить вкладку с использованием TabItem в файле ресурсов, как показано выше?

Solutions Collecting From Web of "Как используется TabItem при размещении в XML-макете?"

Это, по-видимому, относительно недавнее дополнение к библиотеке дизайна, видимо, добавленное в версии 23.2.0, хотя оно не упоминается в истории изменений . Это функциональность довольно простая, и единственными атрибутами, которые, по-видимому, используются, являются три приведенные в ее документах : text , icon и layout .

Из тестирования кажется, что это в основном XML-ярлык для создания новой Tab и настройка ее текста, значка и пользовательского View , как это обычно бывает в коде. Когда он говорит: «Это представление на самом деле не добавлено в TabLayout», я считаю, что это означает, что он не является View в обычном смысле, поскольку вы не можете установить на него какой-либо стандартный атрибут раскладки, например layout_width или background , Это просто служит для того, чтобы TabLayout создавал новую Tab для каждого TabItem и вызывал 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 для текста должен иметь системный идентификатор @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>