6

Ho un TabLayout funzionante e sto provando ad aggiornare il colore del testo della scheda dinamicamente, quando si cambiano le schede. Per fare questo, chiamo il metodo setTabTextColors() sul mio TabLayout come tale:TabLayout.setTabTextColors() non funziona quando si tenta di cambiare il colore del testo

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

    (...) 
}); 

Per qualche ragione, il colore del testo non viene aggiornato. Qualcuno sa come aggiornare il colore del testo della scheda in modo dinamico?

Sto utilizzando la libreria di supporto di progettazione v22.2.0.

risposta

3

E 'finalmente risolto in Design Support Library 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(); 
      } 
      } 

     ... 
     } 
4

Dopo un po 'di indagini, sembra che le visualizzazioni testuali all'interno di TabLayout non ottengano i loro colori aggiornati dopo la loro creazione.

La soluzione che mi è venuta in mente è stata quella di esaminare le viste dei bambini su TabLayout e aggiornare i loro colori direttamente.

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

Poi, nel OnTabSelectedListener:

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

     (...) 
    }); 
0

Inoltre, assicurarsi di non utilizzare un file xml separato per le schede di stile. Qualcosa del genere, come ho avuto (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); 
Problemi correlati