2013-04-18 6 views
5

Mam listview prostych elementów tekstowych. TextView w tych pozycji wygląda następująco (jest owinięty wewnątrz RelativeLayout):Ustawianie kolorów tekstu Android TextView programowo z setTextColor() renderuje android: duplicateParentState invalid

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

chcę użyć następującego selektora stanu kolorów dla tekstu, który nazwałem „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> 

Normalnie, oczywiście, mógłbym ustawić tę właściwość na wartość android:textColor w xml, ale w tym przypadku muszę ustawić programowo jeden konkretny element na inny kolor, używając tego selektora ("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> 

Tak ustawić kolor tekstu w adapterze (language_name i selected są zdefiniowane wcześniej w kodzie):

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

I to działa dobrze, z wyjątkiem jednego problemu: kolor tekstu nie zmienia się, gdy element został kliknięty. Mimo że zadzwonię pod numer setDuplicateParentStateEnabled(true) bezpośrednio po setTextColor(), ustawienie to zostanie całkowicie zignorowane.

Przetestowałem to przez skomentowanie kodu Java, który ustawia kolor tekstu i ustawienie go w xml, a selektor działa dobrze. Ale jeśli programowo ustawiam textColor, jest całkowicie niezdolny do powielenia stanu nadrzędnego.

Czy ktoś to widział wcześniej? Czy istnieje obejście, czy jest to tylko błąd Androida, z którym muszę żyć?

Odpowiedz

21

OK, znalazłem mój błąd. Powinienem używać getResources().getColorStateList() zamiast getResources().getColor(). Pozostawiając to tutaj dla każdego, kto popełnia ten sam błąd.

+0

przyjąć to jako odpowiedź. to jest pomocne. –

+0

Dziękuję za przypomnienie. Gotowe. –

1

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

z systemu Android: textview.setTextColor(Color.BLACK);

Enjoy :)

Powiązane problemy