Подтвердить что ты не робот

Как используется 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 в файле ресурсов, как показано выше?

4b9b3361

Ответ 1

Это, по-видимому, относительно недавнее дополнение к библиотеке дизайна, видимо, добавленное в версии 23.2.0, хотя оно не упоминается в истории изменений. Это функциональность довольно простая, и единственными атрибутами, которые, по-видимому, используются, являются три приведенные в docs: 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 для значка должен иметь идентификатор @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>