Как использовать селекторы для изменения значков с помощью новой вкладки 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, чтобы заполнить вкладку.
Счастливое кодирование;)