Хорошо, я, возможно, нашел очень сложное решение только потому, что у меня не было времени на w ait для следующей версии поддержки-библиотеки.Вот что я сделал:
- Набор пейджера адаптер к вашему TabLayout
tabLayout.setTabsFromPagerAdapter(pagerAdapter);
Добавить слушатель в ViewPager
customViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
tabLayout.getTabAt(position).select();
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
Добавить слушатель в TabLayout
tabLayout.setOnTabSelectedListener(new
TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
if (!isTabUpdating) {
isTabUpdating = true;
final int pos = tab.getPosition();
customViewPager.setCurrentItem(pos);
// Clears and populates all tabs
tabLayout.setTabsFromPagerAdapter(pagerAdapter);
invalidateTabs(pos);
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
if (!isTabUpdating) {
isTabUpdating = true;
final int pos = tab.getPosition();
customViewPager.setCurrentItem(pos);
// Clears and populates all tabs
tabLayout.setTabsFromPagerAdapter(pagerAdapter);
invalidateTabs(pos);
}
}
});
Добавить метод для повторного рисования всех вкладок
private void invalidateTabs(int selected) {
for (int i = 0; i < tabLayout.getTabCount(); i++) {
tabLayout.getTabAt(i).setCustomView(pagerAdapter.getTabView(i, i == selected));
}
isTabUpdating = false;
}
Хорошо, позвольте мне объяснить немного. Прежде всего, вы можете задаться вопросом, почему я использовал setTabsFromPagerAdapter()
вместо setupWithViewPager
. В начале я использовал setupWithViewPager
, но каким-то образом я не работал с моим пейджером, и 1-й элемент не был выбран.
Второе, что вы можете признать - каждый раз, когда я выбираю вкладку, я удаляю все из них. Ну, это была легкая проблема, вы видите, что я источник для android, когда вы вызываете Tab.setCustomView(View)
, он проверяет родителя представления и если он не является нулевым - он удаляет все дочерние элементы. Однако, если вы передаете вновь инстанцированы деталь вы добавите другой вид вместо того, чтобы заменить старую:
View custom = tab.getCustomView();
if(custom != null) {
ViewParent icon = custom.getParent();
if(icon != this) {
if(icon != null) {
// You wont get here
((ViewGroup)icon).removeView(custom);
}
this.addView(custom);
}
...
Итак, я закончил с установкой всех слушателей самостоятельно и воссоздавая все вкладки каждый раз, когда на странице/вкладки. Это НЕ хорошее решение, но, поскольку он не может дождаться, когда Google обновит их lib - это, вероятно, единственное решение для достижения такого эффекта. (На всякий случай вам интересно, почему это так сложно - мне нужно было иметь вкладки с пользовательскими представлениями (текст + изображение), которые могли бы изменить их свойства вида (цвет шрифта, изображение), когда они выбраны/не выбраны)
BTW - Вот getTabView(...)
метод с 4-го этапа:
public View getTabView(int pos, boolean isSeleted) {
View tabview = ((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout
.tab_sessioninfo,
null, false);
final ImageView ivTabIcon = (ImageView) tabview.findViewById(R.id.iv_tab_icon);
final TextView tvTabTittle = (TextView) tabview.findViewById(R.id.tv_tab_title);
if (isSeleted) {
tvTabTittle.setTextColor(context.getResources().getColor(R.color.tab_indicator));
}
switch (pos) {
case 0:
tvTabTittle.setText("1st Tab");
ivTabIcon.setImageResource(isSeleted ? R.drawable.ic_icon1_selected : R.drawable.ic_icon1);
break;
case 1:
tvTabTittle.setText("2nd Tab");
ivTabIcon.setImageResource(isSeleted ? R.drawable.ic_icon2_selected : R.drawable.ic_icon2);
break;
case 2:
tvTabTittle.setText("3rd Tab");
ivTabIcon.setImageResource(isSeleted ? R.drawable.ic_icon3_selected : R.drawable.ic_icon3);
break;
}
return tabview;
}
PS Если вы знаете лучшее решение для всего этого, дайте мне знать!
UPDATE
Лучше решение можно подойти с помощью Reflection:
Простая установка
tabLayout.setupWithViewPager(customViewPager);
customViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
for (int i = 0; i <tabLayout.getTabCount(); i++){
updateTab(tabLayout.getTabAt(i), position == i);
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
Tab Update
private void updateTab(TabLayout.Tab tab, boolean isSelected){
Method method = null;
try {
method = TabLayout.Tab.class.getDeclaredMethod("getCustomView", null);
method.setAccessible(true);
View tabview = (View) method.invoke(tab, null);
final ImageView ivTabIcon = (ImageView) tabview.findViewById(R.id.iv_tab_icon);
final TextView tvTabTittle = (TextView) tabview.findViewById(R.id.tv_tab_title);
if (isSeleted) {
tvTabTittle.setTextColor(context.getResources().getColor(R.color.tab_indicator));
}
switch (pos) {
case 0:
tvTabTittle.setText("1st Tab");
ivTabIcon.setImageResource(isSeleted ? R.drawable.ic_icon1_selected : R.drawable.ic_icon1);
break;
case 1:
tvTabTittle.setText("2nd Tab");
ivTabIcon.setImageResource(isSeleted ? R.drawable.ic_icon2_selected : R.drawable.ic_icon2);
break;
case 2:
tvTabTittle.setText("3rd Tab");
ivTabIcon.setImageResource(isSeleted ? R.drawable.ic_icon3_selected : R.drawable.ic_icon3);
break;
}
tab.setCustomView(tabview);
} catch (Exception e) {
e.printStackTrace();
}
}
UPDATE
Новая библиотека поддержки не имеет публичный метод для getCustomView()
, так что вам не нужно отражения больше нет!
Отлично, я последую за ним. –
@Moinkhan вы можете установить вид как тег для tablayout. –
Хорошо, я понимаю, что вы говорите, но, наконец, ошибка принимается и решается google. Теперь статус этой ошибки будет в будущем выпуске. Таким образом, нам не нужно делать какое-либо сложное решение. – Moinkhan