Селектор цвета текста не работает

Я сделал это раньше. Я скопировал-вставил. Я скопировал множество других примеров из сети. Я просто не могу заставить работать селектор цвета текста. Он устанавливает цвет по умолчанию для текстового представления, но он не изменится, если вы нажмете на текстовое представление. 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>

Это XML-файл settings_selector_txt:

<?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 в папку с цветом также не является решением. Любые идеи?


person erdomester    schedule 22.08.2012    source источник
comment
Если эти ответы полезны, примите их, если они бесполезны, прокомментируйте и скажите, почему?   -  person AliSh    schedule 25.08.2012
comment
Посмотрите это: stackoverflow.com/questions/26920859/   -  person Wendel086    schedule 29.04.2019


Ответы (4)


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

android:clickable="true"

РЕДАКТИРОВАТЬ: Вот и все. Этот макет делает свое дело. Обратите внимание, что представление, которое собирает событие щелчка, является 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>

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

person Jose L Ugia    schedule 22.08.2012
comment
Это не хорошо. Я не хочу нажимать на текстовые представления, так как это означает, что когда я нажимаю на верхний, меняется только цвет текста верхнего. Мне нужно обработать это в linearlayout, - person erdomester; 25.08.2012
comment
Хорошо, я этого не знал. Затем вам нужно наследовать состояние родителя в ваших текстовых представлениях, поместив android:duplicateParentState=true во все представления, которые вам нужны. - person Jose L Ugia; 25.08.2012
comment
Хотя убедитесь, что вы установили свой родительский макет (ваш LinearLayout в этом случае) clickable = true. - person Jose L Ugia; 25.08.2012
comment
Конкретнее пожалуйста с кодом. Добавление android:duplicateParentState=true в TextView и добавление android:textColor=@drawable/settings_selector_txt в linearlayout вокруг текстового представления ничего не делает - person erdomester; 27.08.2012
comment
Вам не нужно добавлять селектор цвета в LinearLayout. Идея состоит в том, что textview примет состояние своего родителя (в данном случае LinearLayout). Вот почему нам нужно добавить дубликатParentState в текстовое представление. Состояние, которого мы хотим достичь и для которого у нас есть селектор, — это состояние нажатия. И мы просто хотим, чтобы наш TextView достиг этого состояния, чтобы единственным представлением, которому нужен селектор, был этот. (наш TextView) Больше ничего не нужно. Если вам все еще нужна дополнительная помощь, я дам вам код. Но лучше угадать ;) - person Jose L Ugia; 27.08.2012
comment
Я действительно понятия не имею, что я должен сделать, чтобы заставить эту работу работать. Помогите пожалуйста с кодом - person erdomester; 30.08.2012
comment
Я собираюсь попробовать это через 24 часа, я был в отпуске - person erdomester; 03.09.2012
comment
Спасибо. Я думал, что сделал то же самое, но почему-то должно быть по-другому. - person erdomester; 05.09.2012
comment
Я думаю, также стоит отметить, что в этих селекторах вы не можете использовать ссылочные цвета (по крайней мере, с API 19). Это должны быть шестнадцатеричные числа, начинающиеся с #. Мне потребовалось некоторое время, чтобы заметить с помощью всплывающей подсказки Eclipse, что android:color должен быть шестнадцатеричным. - person frenziedherring; 11.02.2014

Я думаю, что использование 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);
person mr.boyfox    schedule 09.07.2015

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

person Thalis Vilela    schedule 10.07.2014

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

person AliSh    schedule 22.08.2012