У меня есть TabLayout с селектором в качестве фона индикатора, например:
<android.support.design.widget.TabLayout
android:id = "@+id/custom_indicator"
android:layout_width = "wrap_content"
android:layout_height = "3dp"
android:layout_gravity = "bottom|center"
app:tabBackground = "@drawable/dashpageindicator"
app:tabMinWidth = "5dp"
app:tabMaxWidth = "15dp"
app:tabGravity = "fill"
app:tabIndicatorHeight = "0dp"
app:tabMode = "scrollable"
android:layout_marginBottom = "24dp"
app:tabPaddingStart = "0dp"
app:tabPaddingEnd = "0dp">
Выдвижной dashpageindicator вот такой:
<?xml version = "1.0" encoding = "utf-8"?>
<selector xmlns:android = "http://schemas.android.com/apk/res/android">
<item android:drawable = "@drawable/indicator_dash_selected"
android:state_selected = "true" />
<item android:drawable = "@drawable/indicator_dash_unselected" />
</selector>
indicator_dash_selected и indicator_dash_unselected - это layer-list с разной шириной и высотой, например:
indicator_dash_selected
<layer-list xmlns:android = "http://schemas.android.com/apk/res/android">
<item android:start = "1dp" android:end = "1dp">
<shape
android:innerRadius = "0dp"
android:shape = "rectangle"
android:thickness = "2dp"
android:useLevel = "false">
<size android:height = "2dp" android:width = "12dp" />
<solid android:color = "@color/default_text_color"/>
<padding android:left = "0dp" android:right = "0dp" />
</shape>
</item>
indicator_dash_unselected
<layer-list xmlns:android = "http://schemas.android.com/apk/res/android">
<item android:start = "1dp" android:end = "1dp">
<shape
android:innerRadius = "0dp"
android:shape = "rectangle"
android:thickness = "2dp"
android:useLevel = "false">
<size android:height = "0.5dp" android:width = "4dp" />
<solid android:color = "@color/default_text_color"/>
<padding android:left = "0dp" android:right = "0dp" />
</shape>
</item>
Я предполагаю, что когда выбран конкретный элемент ViewPager, элемент вкладки должен расти следующим образом:
Однако, когда я перехожу к другим вкладкам, они довольно часто не растут в width. Вместо этого они:
Все атрибуты layer-list работают нормально, за исключением sizewidth.
Я говорю довольно часто, потому что иногда он работает отлично. Вторая вкладка увеличивается до ожидаемых ширины и высоты, если выбрана вторая вкладка. Третья вкладка увеличивается, если она выбрана, и так далее. Но чаще всего нет.
Кроме того, всякий раз, когда это срабатывает, что случается редко, я замечаю задержку в несколько секунд. Это означает, что фон выбранной вкладки остается indicator_dash_unselected в течение нескольких секунд или минут, прежде чем станет indicator_dash_selected.
Я также заметил, что selector работает после нескольких секунд ожидания:
ActivityActivity,
TabLayout и ViewPagerВот так:
Nota Bene:TabLayout находится в CoordinatorLayout вместе с ViewPager и ConstraintLayout, что и fitsSystemWindows.
Любая помощь или понимание будут оценены.
ПРОГРЕСС: Действуя по совету @Dhananjay поместить оба layer-list внутрь selectoritems, это решение тоже не работает:
<selector xmlns:android = "http://schemas.android.com/apk/res/android">
<item android:state_selected = "true" >
<layer-list>
<item android:start = "1dp" android:end = "1dp">
<shape
android:innerRadius = "0dp"
android:shape = "rectangle"
android:thickness = "2dp"
android:useLevel = "false">
<size android:height = "2dp" android:width = "12dp" />
<solid android:color = "#ffffff"/>
<padding android:left = "0dp" android:right = "0dp" />
</shape>
</item>
</layer-list>
</item>
<item android:state_selected = "false" >
<layer-list>
<item android:start = "1dp" android:end = "1dp"
android:top = "1dp" android:bottom = "1dp">
<shape
android:innerRadius = "0dp"
android:shape = "rectangle"
android:thickness = "1dp"
android:useLevel = "false">
<size android:height = "0.5dp" android:width = "4dp" />
<solid android:color = "#ffffff"/>
<padding android:left = "4dp" android:right = "4dp" />
</shape>
</item>
</layer-list>
</item>
</selector>
Вы можете попробовать этот обходной путь.
for (int i = 0; i < viewPager.getAdapter().getCount(); i++) {
TabLayout.Tab tab = tabLayout.getTabAt(i);
View view = new View(this);
tab.setCustomView(view);
View v = (View) tab.getCustomView().getParent();
if (tabLayout.getSelectedTabPosition() == i)
v.setLayoutParams(new LinearLayout.LayoutParams(150, 10));
else
v.setLayoutParams(new LinearLayout.LayoutParams(50, 10));
v.setBackgroundResource(R.drawable.dashpageindicator);
}
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
changeTabDimen(tab, 150);
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
changeTabDimen(tab, 50);
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
changeTabDimen(tab, 150);
}
});
}
private void changeTabDimen(TabLayout.Tab tab, int i) {
View view = new View(this);
tab.setCustomView(view);
View v = (View) tab.getCustomView().getParent();
v.setLayoutParams(new LinearLayout.LayoutParams(i, 10));
v.setBackgroundResource(R.drawable.dashpageindicator);
}
Также измените свой Tablayout
<android.support.design.widget.TabLayout
android:id = "@+id/custom_indicator"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
app:tabIndicatorHeight = "0dp"
app:tabBackground = "@drawable/dashpageindicator"
android:layout_marginBottom = "24dp"
android:layout_gravity = "bottom|center"
app:tabPaddingStart = "0dp"
app:tabPaddingEnd = "0dp"/>
Можете попробовать поместить код формы прямо в селектор xml? также измените цвет фона одного селектора, чтобы проверить, меняются ли они при отмене выбора.
Просто попробовал, поместив layer-list прямо в selectoritems. Тоже не работает. Я даже изменил цвет solid на прямое шестнадцатеричное значение. У меня все та же проблема, @Dhananjay. :(
Меняется ли цвет выбранной вкладки? Если вы установите другой цвет в indicator_dash_selected, скажем, зеленый. Он меняется для выбранной вкладки?
Цвет не меняется при переключении между элементами селектора. Хотя каждый селектор имеет один и тот же цвет, явно определенный в них.
Я отредактировал ответ в приведенном выше коде после настройки tablayout с помощью viewpager.
Позвольте нам продолжить обсуждение в чате.
Привет @Dhananjay! Ваше решение работает! --- по большей части. Подробности выложу позже :)
К сожалению, не работает. Опять же, все остальное, касающееся
indicator_dash_selectedиindicator_dash_unselected, работает сразу, за исключением изменения вwidth.