как используется tabitem при размещении в макете xml?

<p>документация <a href="https://developer.android.com/reference/android/support/design/widget/tablayout.html"><code>tablayout</code></a> приводит пример вложения <code>tabitem</code> непосредственно в <code>tablayout</code>, например так:</p><pre><code><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> </code></pre><p>но это не дает примера того, как это можно использовать на практике, и документация для tabitem гласит:</p><blockquote> <p>это представление на самом деле не добавляется в tablayout, это просто фиктивный элемент, который позволяет задавать текст, значок и пользовательский макет элементов вкладки. </p> </blockquote><p>так для чего <code>tabitem</code>? после обширного поиска в google я не могу найти ни одного примера, когда кто-либо определял бы tabitems в xml. есть ли способ настроить действие с вкладками, используя tabitem в файле ресурсов, как показано выше? </p>

<p>похоже, это относительно недавнее дополнение к библиотеке дизайна, по-видимому, добавленное в версию 23.2.0, хотя это не упоминается в <a href="https://developer.android.com/topic/libraries/support-library/revisions.html">истории изменений</a> . его функциональность довольно проста, и единственные атрибуты, которые он использует, - это три, которые указаны в его <a href="https://developer.android.com/reference/android/support/design/widget/tabitem.html">docs</a> : <code>text</code>, <code>icon</code> и <code>layout</code>.</p><p>из тестирования кажется, что это в основном ярлык xml для создания новой <code>tab</code> и установки ее текста, значка и пользовательской <code>view</code>, как это обычно делается в коде. когда он говорит: «это представление на самом деле не добавляется в tablayout», я полагаю, что оно подразумевает, что оно не является <code>view</code> в обычном смысле, поскольку вы не можете установить для него какой-либо стандартный атрибут макета, например <code>layout\_width</code> или <code>background</code> , он просто служит для того, чтобы <code>tablayout</code> создавал новую <code>tab</code> для каждой <code>tabitem</code>, и вызывал <code>settext()</code>, <code>seticon()</code> и <code>setcustomview()</code> соответственно.</p><p>например, чтобы добавить <code>tab</code> в код, мы обычно делаем что-то вроде этого:</p><pre><code>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); </code></pre><p>тогда как теперь мы можем заменить все после комментария выше, добавив <code>tabitem</code> в макет.</p><pre><code><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> </code></pre><p>обратите внимание, что те же требования для пользовательского макета <code>view</code> все еще применяются. то есть <code>textview</code> для текста должен иметь системный идентификатор ресурса <code>@android:id/text1</code>, а <code>imageview</code> для значка должен иметь идентификатор <code>@android:id/icon</code>. например, <code>r.layout.tab</code> сверху:</p><pre><code><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> </code></pre>

<p>быстрое дополнение к @mikes очень полезный ответ:</p><p>в android studio теперь есть шаблон для использования <code>tablayout</code> с настройкой <code>tabitem</code> в xml-макете. создайте все необходимые файлы с помощью <strong>"new> activity> tabaged activity"</strong> и выберите <strong>"вкладки панели действий (с viewpager)"</strong>, как показано на скриншоте:</p><p> <a href="https://i.stack.imgur.com/35ozd.png"> <img src="https://i.stack.imgur.com/35ozd.png" alt="configure tabbed activity template in android studio"> </a> </p><p>если вы хотите настроить внешний вид <code>tabitem</code> без настраиваемого представления: используйте <strong>white vector assets</strong> в качестве вкладки <code>android:icon</code> и <strong>tint</strong> их с помощью селектора (предоставляя различные цвета на основе <code>android:state\_selected</code>) </p><p>цвет линии под выбранной в данный момент вкладкой устанавливается как <code>app:tabindicatorcolor</code> для тега <code>tablayout</code>.</p><p>мне потребовалось некоторое время, чтобы заставить его работать, поэтому полные шаги превратились в такой длинный ответ, что я не хочу копировать их здесь. вы можете найти мой более подробный ответ с полным кодом по адресу:</p><p> <a href="https://stackoverflow.com/a/49603559/414581">https://stackoverflow.com/a/49603559/414581</a> </p>