6

Ich habe eine funktionierende TabLayout, und ich versuche, die Registerkarte Textfarbe dynamisch zu aktualisieren, wenn Tabs geändert werden. Dazu rufe ich die setTabTextColors() Methode auf meinem TabLayout als solche:TabLayout.setTabTextColors() funktioniert nicht, wenn versucht wird, die Textfarbe zu ändern

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

    (...) 
}); 

Aus irgendeinem Grund die Textfarbe nicht aktualisiert. Weiß jemand, wie man die Tab-Textfarbe dynamisch aktualisiert?

Ich verwende die Design Support Library v22.2.0.

Antwort

3

Es ist endlich in Design Support-Bibliothek 22.2.1 behoben.

 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(); 
      } 
      } 

     ... 
     } 
4

Nach ein wenig Nachforschungen scheint es so, als würden die Textansichten im TabLayout nach der Erstellung nicht aktualisiert.

Die Lösung, die ich mir ausgedacht hatte, war, die Kinderansichten des TabLayouts zu durchlaufen und ihre Farben direkt zu aktualisieren.

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); 
     } 
    } 
} 

Dann im OnTabSelectedListener:

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

     (...) 
    }); 
0

Stellen Sie außerdem sicher, dass Sie keine separate XML-Datei zum Formatieren von Registerkarten verwenden. So etwas wie ich (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); 
Verwandte Themen