2013-04-18 5 views
5

Ho una lista di semplici elementi di testo. Il TextView a tali elementi si presenta così (è avvolto all'interno di un RelativeLayout):Impostare il colore del testo Android TextView a livello di codice con setTextColor() rende android: duplicateParentState non valido

<TextView 
    android:id="@+id/text_language_name" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_centerVertical="true" 
    android:duplicateParentState="true" 
    android:textSize="16sp" 
    android:textStyle="bold" /> 

voglio usare il seguente selettore stato di colore per il testo, che ho chiamato "dark_list_text_states.xml":

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:state_pressed="true" android:color="@android:color/white"/> 
    <item android:color="@color/dark_list_text"/> 

</selector> 

Normalmente, ovviamente, potrei semplicemente impostarlo sulla proprietà android:textColor nell'xml, ma in questo caso, ho bisogno di impostare un particolare elemento in modo programmatico su un colore diverso, usando questo selettore ("blue_text_states.xml"):

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:state_pressed="true" android:color="@android:color/white"/> 
    <item android:color="@color/selected_blue"/> 

</selector> 

così mi sono messo il colore del testo nel Adapter (language_name e selected sono definiti in precedenza nel codice):

 TextView text_language_name = (TextView)view.findViewById(R.id.text_language_name); 
     if (text_language_name != null) { 
      text_language_name.setText(language_name); 
      int text_color = selected 
          ? getResources().getColor(R.color.blue_text_states) 
          : getResources().getColor(R.color.dark_list_text_states); 
      text_language_name.setTextColor(text_color); 
      text_language_name.setDuplicateParentStateEnabled(true); 
     } 

E questo funziona bene, tranne che per un problema: il colore del testo non cambia quando il l'oggetto è cliccato. Anche se chiamo setDuplicateParentStateEnabled(true) sull'articolo subito dopo setTextColor(), quell'impostazione è completamente ignorata.

Ho provato questo commentando il codice Java che imposta il colore del testo e semplicemente impostandolo in xml, e il selettore funziona bene. Ma se imposto programmaticamente textColor, è completamente incapace di duplicare lo stato genitore.

Qualcuno ha visto questo prima? C'è una soluzione alternativa, o è solo un bug di Android con cui devo convivere?

risposta

21

OK, ho trovato il mio errore. Dovrei utilizzare getResources().getColorStateList() anziché getResources().getColor(). Lasciando questo qui per chiunque altro faccia lo stesso errore.

+0

accettare questo come risposta. è utile. –

+0

Grazie per avermelo ricordato. Fatto. –

1

Da colors.xml: textview.setTextColor(getResources().getColor(R.color.your_color));

Da sistema Android: textview.setTextColor(Color.BLACK);

Enjoy :)