Селектор Textcolor не работает

Я делал это раньше. Я скопировал. Я скопировал много других примеров из сети. Я просто не могу заставить селектор textcolor работать. Он устанавливает цвет по умолчанию для textview, но он не изменится, если вы нажмете на textview. Settings_selector для фона работает нормально.

это макет:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/settings_selector"
    android:clickable="true"
    android:id="@+id/llRecentChanges"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:paddingLeft="5dp">
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/llRecentChanges2"
        android:layout_weight="1"
        android:layout_gravity="center_vertical">
    <TextView
        android:id="@+id/tvAbout"
        android:text="@string/settings_recentchanges"
        android:gravity="center_vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="16dp"
        android:textColor="@drawable/settings_selector_txt" >
    </TextView>
    <TextView
        android:id="@+id/tvAbout2"
        android:text="@string/settings_recentchanges2"
        android:gravity="center_vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@drawable/settings_selector_txt"
        android:textSize="10dp">
    </TextView>
    </LinearLayout>

</LinearLayout>

это settings_selector_txt xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" 
          android:state_pressed="false" 
          android:color="#FFFFFF" />
    <item android:state_focused="true" 
          android:state_pressed="true"
          android:color="#ffa800" />
    <item android:state_focused="false" 
          android:state_pressed="true"
          android:color="#ffa800" />
    <item android:color="#FFFFFF" />
</selector>

или это

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

    <item android:state_selected="true" android:color="#444"/>
    <item android:state_focused="true" android:color="#444"/>
    <item android:state_pressed="true" android:color="#444"/>
    <item android:color="#ccc"/>

</selector>

или это

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:state_pressed="false" android:color="#ffffff" />
    <item android:state_focused="true" android:state_pressed="true" android:color="#000000" />
    <item android:state_focused="false" android:state_pressed="true" android:color="#000000" />
    <item android:color="#ffffff" />
</selector>

ни один из они работают. Помещение селектора xml в папку цвета также не является решением. Есть идеи?

5 ответов


убедитесь, что ваш TextView готов к прослушиванию состояний, на которые вы подаете заявку. Например, чтобы иметь возможность достичь "state_pressed", ваш textView должен быть кликабельным:

android:clickable="true"

EDIT: вот так. Этот макет делает работу. Обратите внимание, что представление, собирающее событие click, является linearLayout, но TextView воспроизводит его из-за "duplicateParentState", установленного в true. Селектор цветов будет заботиться о цветах для различных штат.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/testLlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:clickable="true" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@drawable/textview_selector"
        android:duplicateParentState="true"
        android:text="TextView" />

</LinearLayout>

и вот код для выбора цвета.

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

    <item android:state_selected="true" android:color="#444"/>
    <item android:state_focused="true"  android:color="#444"/>
    <item android:state_pressed="true"  android:color="#444"/>
    <item android:color="#ccc"/>

</selector>

это должно быть так.


нет необходимости устанавливать android:clickable="true" в TextView или android:duplicateParentState="true".

решение
Шаг-1: Определите свой селектор цвета под res / color папка (селектор цвета Jose L Ugia хорош для этого.)
Шаг 2: установите этот селектор цвета в TextView как android:textColor="@color/m_text_selector" (не как @drawable/*!!!)

Примечание: если вы хотите установить селектор textColor программно, вы должны получить селектор как список состояния цвета не как цвет;

textView.setTextColor(getResources().getColorStateList(R.color.m_text_selector));


Вот и все.


убедитесь, что все макеты, которые могут обернуть ваши TextViews перед вашим "кликабельным" макетом, также имеют duplicateParentState="true", иначе текстовое представление не достигнет состояния элемента, которое вы хотите.


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

int[][] states = new int[][] {
    new int[] { android.R.attr.state_pressed}, // pressed
    new int[] { android.R.attr.state_focused}, // focused
    new int[] {}
};
int[] colors = new int[] {
    getResources().getColor(R.color.green_color), // green
    getResources().getColor(R.color.green_color), // green
    getResources().getColor(R.color.white)  // white
};
ColorStateList list = new ColorStateList(states, colors);
mTextView.setFocusable(true);
mTextView.setClickable(true);
mTextView.setTextColor(list);

вы должны установить это в ваш код : android:clickable="true" для TextViews