TabLayout.setTabTextColors() не работает при попытке изменить цвет текста

у меня есть рабочий TabLayout, и я пытаюсь обновить цвет текста вкладки динамически, при изменении вкладок. Для этого я вызываю setTabTextColors() метод на моем TabLayout как таковой:

tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
    @Override
    public void onTabSelected(TabLayout.Tab tab) {
        tabLayout.setTabTextColors(newColorStateList);
    }

    (...)
});

по какой-то причине цвет текста не обновляется. Кто-нибудь знает, как динамически обновлять цвет текста вкладки?

Я использую библиотеку поддержки дизайна v22.2.0.

3 ответов


это, наконец, исправлено в библиотеке поддержки дизайна 22.2.1.

        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
          @Override
          public void onTabSelected(TabLayout.Tab tab) {
            tabLayout.setTabTextColors(getResources().getColor(R.color.normal), getResources().getColor(R.color.selected));

            try {
                // FIXME: 20.7.2015 WORKAROUND: https://code.google.com/p/android/issues/detail?id=175182 change indicator color
                Field field = TabLayout.class.getDeclaredField("mTabStrip");
                field.setAccessible(true);
                Object value = field.get(tabLayout);

                Method method = value.getClass().getDeclaredMethod("setSelectedIndicatorColor", Integer.TYPE);
                method.setAccessible(true);
                method.invoke(value, getResources().getColor(R.color.selected));
            } catch (Exception e) {
                e.printStackTrace();
            }
          }

        ...
        }

после небольшого исследования кажется, что textviews внутри TabLayout просто не обновляют свои цвета после их создания.

решение, которое я придумал, состояло в том, чтобы пройти через представления детей TabLayout и обновить их цвета напрямую.

public static void setChildTextViewsColor(ViewGroup viewGroup, ColorStateList colorStateList) {
    for (int i = 0; i < viewGroup.getChildCount(); i++) {
        View child = viewGroup.getChildAt(i);

        if (child instanceof ViewGroup) {
            setChildTextViewsColor((ViewGroup) child, colorStateList);
        } else if (child instanceof TextView) {
            TextView textView = (TextView) child;
            textView.setTextColor(colorStateList);
        }
    }
}

затем в OnTabSelectedListener:

    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            setChildTextViewsColor(tabLayout, newColorStateList);
        }

        (...)
    });

кроме того, убедитесь, что вы не используете отдельный xml-файл для стилей вкладок. Что-то вроде этого, как у меня (custom_tab.XML-код):

    TextView tabOne = (TextView) LayoutInflater.from(this).inflate(R.layout.custom_tab, null);
    tabOne.setText(R.string.tab_response);
    tabOne.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.tab_bar_icon_response, 0, 0);
    tabLayout.getTabAt(0).setCustomView(tabOne);