Выделить первый элемент в пейджере представления, когда действие загружается при использовании пользовательского представления с макетом вкладок?

Я работаю над вкладками, такими как приложение YouTube, и хотел бы выделить первую страницу при загрузке активности, поэтому я использовал следующий код

viewpager.setCurrentItem(0);//which does not highlight first tab onstarting the tab activity

И я использовал drawable в качестве фона для значков в tablayout. Я устанавливаю фон для рисования при создании фрагмента, получая каждый дочерний элемент tablayout. Я установил цвет текста в

<item name="tabTextAppearance">@style/TabTextAppearance</item>

</style>
<style name="TabTextAppearance" parent="TextAppearance.Design.Tab">
    <item name="android:textColor">@color/tab_text_selector</item>
    <item name="android:textAllCaps">false</item>
</style>

Один из файлов селектора

< ?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_selected="true" android:drawable="@drawable/favorite_selected" />
        <item android:state_focused="true" android:drawable="@drawable/favorite_selected" />
        <item android:state_pressed="true" android:drawable="@drawable/favorite_selected" />
        <item android:drawable="@drawable/favorites" />
    </selector>

Есть два других чертежа, и я использую собственный макет для вкладок. Как я могу отобразить первый элемент, выделенный при загрузке приложения в пейджере просмотра.


person Preethi    schedule 21.12.2015    source источник
comment
Что именно вы подразумеваете под не выбранным? Это строго о цвете фона выбранной вкладки?   -  person Daniel Nugent    schedule 29.12.2015
comment
какой твой первый предмет?   -  person Linh    schedule 29.12.2015
comment
Когда активность вкладки загружается, я хочу, чтобы первый элемент был выделен, как в приложении YouTube. Прямо сейчас первый элемент не выбран по умолчанию, но когда пользователь проводит пальцем, элемент выбирается.   -  person Preethi    schedule 29.12.2015


Ответы (2)


Это немного сложно.

введите здесь описание изображения

Вы должны установить фон таким образом:

<android.support.design.widget.TabLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/tabLayout"
    app:tabBackground="@drawable/tab_background"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

т.е. изменить android:background на app:tabBackground

Теперь, когда вы нажимаете на вкладку, она получает правильный фон drawable.

Чтобы применить селектор к значкам в TabLayout:

tabLayout.setupWithViewPager(viewPager);
for (int i = 0; i < mTabLayout.getTabCount(); i++) {
    tabLayout.getTabAt(i).setIcon(R.drawable.icon_i_selector);
}

УПД:

Покопавшись взад и вперед, вместе с @Preethi мы решили эту проблему:

 tabLayout.getTabAt(0).getCustomView().setSelected(true);

Важное примечание. @Preethi использует метод setCustomView() для установки View для Tab.

Другой возможный обходной путь — избегать пользовательских представлений и устанавливать TextColor&Icons следующим образом:

    tabLayout.setTabTextColors(getColor(R.color.normal_color), getColor(R.color.selected_color));
    for (int i = 0; i < tabLayout.getTabCount(); i++) {
        tabLayout.getTabAt(i).setIcon(R.drawable.icon_selector);
    }
person Konstantin Loginov    schedule 29.12.2015
comment
Это, безусловно, помогает. Но скажем, каждая вкладка (три вкладки) имеет возможность рисования и текст. Я добавил в вопрос файлы селектора текста и изображения. - person Preethi; 29.12.2015
comment
@Прити Хорошо, а в чем вопрос? Иконки также можно обернуть в селектор и установить: (в цикле) tabLayout.getTabAt(i).setIcon(R.drawable.your_icon_i_selector); ; TextAppearance можно установить в макете через app:tabTextAppearance=.. - person Konstantin Loginov; 29.12.2015
comment
Я сделал то же самое, но первый элемент никогда не отображается выбранным, когда отображается активность вкладки. - person Preethi; 29.12.2015
comment
@Preethi, то есть вам нужно щелкнуть еще раз, чтобы выбрать первую вкладку, верно? - person Konstantin Loginov; 29.12.2015
comment
К сожалению, это означает, что первый элемент никогда не отображается выбранным. Как и в приложении YouTube, когда вы открываете значок дома, он выделяется и становится белым, так же, как мне нужно, чтобы избранное было выбрано, а значок менялся, когда пользователь впервые открывает действие. - person Preethi; 29.12.2015
comment
@Preethi, если вы просто viewPager.setAdapter(...);, а затем tabLayout.setupWithViewPager(viewPager) - первый элемент будет выбран по умолчанию в TabLayout (и ViewPager показывает первую страницу). Можете ли вы опубликовать код своей деятельности, где вы их настраиваете? - person Konstantin Loginov; 29.12.2015
comment
Давайте продолжим обсуждение в чате. - person Konstantin Loginov; 29.12.2015
comment
Давайте продолжим обсуждение в чате. - person Preethi; 30.12.2015

Вы пытаетесь выбрать первый элемент на странице просмотра или первую вкладку?
Для последнего попробуйте

tabLayout.getTabAt(0).select();  

вместо

viewpager.setCurrentItem(0);
person Rick Sanchez    schedule 21.12.2015
comment
Добавил этот код в OnCreate, и все равно первые элементы не выбраны. - person Preethi; 21.12.2015