Как использовать селекторы для изменения значков с помощью новой вкладки TabLayout

Я использую новую поддержку TabLayout от Android. Дело в том, что я хотел использовать селекторы для изменения значка при выборе вкладки.

Я изучал исходный код, и мне кажется, что он никогда не меняет состояние представления (и по этой причине я не могу использовать селектор).

Кто-нибудь знает об обходном пути?

Спасибо!

Ответ 1

Существует способ установки customView в качестве вкладки с помощью метода setCustomView (View view). Таким образом, вы можете создать текстовое представление и установить для него селектор и установить для этого представления вкладку.

Надеюсь, это поможет вам!

Ответ 2

Предположим, что ваш my_selector.xml есть,

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/icon_on" android:state_selected="true"/>
    <item android:drawable="@drawable/icon_off"/> <!-- default -->
</selector>

то вы можете напрямую вызвать setIcon,

tab.setIcon(R.drawable.my_selector);

Проверено с помощью "com.android.support:design:22.2.0".

Ответ 3

Я обнаружил, что, когда я впервые установил пользовательский вид для каждой вкладки в TabLayout, мне нужно установить первый (индекс 0) как выбранный.

    TabLayout toolbarTabLayout = (TabLayout) findViewById(R.id.tabs);
    toolbarTabLayout.setupWithViewPager(mViewPager);
    toolbarTabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
    toolbarTabLayout.setTabMode(TabLayout.MODE_FIXED);
    toolbarTabLayout.setTabTextColors(R.color.colorPrimary, R.color.white);
    // Iterate over all tabs and set the custom view
    for (int i = 0; i < toolbarTabLayout.getTabCount(); i++) {
        TabLayout.Tab tab = toolbarTabLayout.getTabAt(i);
        View v=mSectionsPagerAdapter.getTabView(i);
        // no tabs are actually selected at start, this will make sure the
        // selector for the colors comes in right when initialized
        if (i==0)
            v.setSelected(true);
        tab.setCustomView(v);
    }

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

Ответ 4

Если вы все сделали правильно (и я верю в это), вы пришли в тот же момент, чем я. Возможно, это небольшая ошибка в новой библиотеке appcompat для Android.

Я нашел обходное решение (он назывался Gambiarra в хороших португальцах), чтобы решить эту проблему. вам нужно вызвать метод select() из класса Tab следующим образом:

mTabLayout.getTabAt(x).select();

НО это очень важно: переменная x должна отличаться от текущего выбранного индекса вкладки.

Ответ 5

Это то, что сработало для меня:

Предполагая, что у вас есть ваши селекторы, установленные в папке resable res (например, Xingang Huang, показанной выше). В вашей MainActivity (где вы настраиваете TabLayout) вы включаете в себя массив селекторов значков, а затем проделываете его так:

for (int i = 0; i < yourTabLayout.getTabCount(); i++) {
        ImageView imageView = new ImageView(this); //your context, in this case MainActivity.class
        imageView.setImageResource(arr_tabIcons[i]); //tabIcons is the array of icons
        if (i==0) {
            imageView.setSelected(true); 
        }
        yourTabLayout.getTabAt(i).setCustomView(imageView);

    }

tab.setIcon(R.drawable.icon)

работает, но в моем случае значки выглядели очень маленькими, поэтому мне пришлось использовать решение с ImageView, чтобы заполнить вкладку.

Счастливое кодирование;)