Селектор TabBackground часто не применяет всю ширину списков слоев, когда вы выбираете / отменяете выбор TabItems в TabLayout

У меня есть 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, элемент вкладки должен расти следующим образом:

Селектор TabBackground часто не применяет всю ширину списков слоев, когда вы выбираете / отменяете выбор TabItems в TabLayout

Однако, когда я перехожу к другим вкладкам, они довольно часто не растут в width. Вместо этого они:

Селектор TabBackground часто не применяет всю ширину списков слоев, когда вы выбираете / отменяете выбор TabItems в TabLayout

Все атрибуты layer-list работают нормально, за исключением sizewidth.

Я говорю довольно часто, потому что иногда он работает отлично. Вторая вкладка увеличивается до ожидаемых ширины и высоты, если выбрана вторая вкладка. Третья вкладка увеличивается, если она выбрана, и так далее. Но чаще всего нет.

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

Я также заметил, что selector работает после нескольких секунд ожидания:

  1. Собираюсь на новый Activity
  2. Возвращаясь к корпусу Activity, TabLayout и ViewPager

Вот так:

Селектор TabBackground часто не применяет всю ширину списков слоев, когда вы выбираете / отменяете выбор TabItems в TabLayout

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>
0
0
43
1

Ответы 1

Вы можете попробовать этот обходной путь.

  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"/>

К сожалению, не работает. Опять же, все остальное, касающееся indicator_dash_selected и indicator_dash_unselected, работает сразу, за исключением изменения в width.

Monica Aspiras Labbao 23.04.2018 11:31

Можете попробовать поместить код формы прямо в селектор xml? также измените цвет фона одного селектора, чтобы проверить, меняются ли они при отмене выбора.

Deˣ 23.04.2018 11:34

Просто попробовал, поместив layer-list прямо в selectoritems. Тоже не работает. Я даже изменил цвет solid на прямое шестнадцатеричное значение. У меня все та же проблема, @Dhananjay. :(

Monica Aspiras Labbao 23.04.2018 11:41

Меняется ли цвет выбранной вкладки? Если вы установите другой цвет в indicator_dash_selected, скажем, зеленый. Он меняется для выбранной вкладки?

Deˣ 23.04.2018 11:45

Цвет не меняется при переключении между элементами селектора. Хотя каждый селектор имеет один и тот же цвет, явно определенный в них.

Monica Aspiras Labbao 23.04.2018 11:46

Я отредактировал ответ в приведенном выше коде после настройки tablayout с помощью viewpager.

Deˣ 23.04.2018 12:40

Позвольте нам продолжить обсуждение в чате.

Deˣ 24.04.2018 06:45

Привет @Dhananjay! Ваше решение работает! --- по большей части. Подробности выложу позже :)

Monica Aspiras Labbao 26.04.2018 04:44

Другие вопросы по теме