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

Правил съм това преди. Копирах-поставих. Копи-пействах много други примери от нета. Просто не мога да накарам селектора за цвят на текста да работи. Той задава цвета по подразбиране на текстовия изглед, но няма да се промени, ако щракнете върху текстовия изглед. 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
Това не е хубаво. Не искам да щракам върху текстовите изгледи, тъй като това означава, че когато щракна върху горния, само цветът на текста на горния се променя. Трябва да се справя с това в линейното оформление, - 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. Идеята е, че текстовият изглед ще приеме състоянието на своя родител (LinearLayout в този случай). Ето защо трябва да добавим duplicateParentState към текстовия изглед. Състоянието, което искаме да достигнем и за което имаме селектор е натиснато състояние. И ние просто искаме нашият TextView да достигне това състояние, така че единственият View, който се нуждае от селектора, да е този. (нашият 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 преди вашето "кликващо" оформление, също имат duplicateParentState="true", в противен случай текстовият изглед няма да достигне желаното от вас състояние на елемента.

person Thalis Vilela    schedule 10.07.2014

Трябва да зададете това във вашия код: android:clickable="true" за TextViews

person AliSh    schedule 22.08.2012