Селектор Android и цвет текста

Я хочу, чтобы простой TextView вел себя так же, как simple_list_item_1 в ListView. Вот XML:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content" android:layout_width="fill_parent"
    android:gravity="center" android:focusable="true"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:background="@android:drawable/list_selector_background" />

Все работает, кроме цвета текста, который (как и ожидалось) не меняется в сфокусированном состоянии. Как изменить его на textAppearanceLargeInverse?


person yanchenko    schedule 02.08.2009    source источник
comment
Если кому-то нужен XML-файл, он находится здесь: developer .android.com/resources/samples/Home/res/color/   -  person swinefeaster    schedule 13.08.2010


Ответы (9)


Я сделал несколько тестов, пока один не сработал, поэтому: res/color/button_dark_text.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="#000000" /> <!-- pressed -->
     <item android:state_focused="true"
           android:color="#000000" /> <!-- focused -->
     <item android:color="#FFFFFF" /> <!-- default -->
 </selector>

рез/макет/view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   >
    <Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="EXIT"
       android:textColor="@color/button_dark_text" />
</LinearLayout>
person Klaus Balduino    schedule 25.08.2010
comment
без android:drawable приложение вылетает с этим селектором xml - person neufuture; 18.09.2011
comment
@neufuture: вам нужно использовать android:textColor="@color/button_dark_text" - person Paul; 14.06.2012
comment
Существует документ, описывающий списки состояний цвета: developer.android. com/guide/topics/resources/ - person Rick77; 11.06.2013
comment
Как любопытство, это также работает, когда текст, кнопка или любой элемент был активирован, например, для элемента списка. ‹item android:state_activated=true android:color=@android:color/white /› - person jiahao; 10.06.2014
comment
Должен ли селектор действительно находиться в папке res/color? - person mr5; 21.04.2017
comment
Хотя шестнадцатеричная запись поддерживается. Обратите внимание, что шестнадцатеричная запись с альфа-каналом не является (например, # 10FFFFFF белый, прозрачность 50%). В этом отношении лучше использовать ссылку на цветовой ресурс (например, @color/your_color_resource). - person ChinLoong; 17.02.2019
comment
@ mr5 и всем, кто пытается это реализовать: Да важно поместить селектор под res/color. Только там можно добавить цвет (вместо рисуемого) в селектор! В противном случае вы получите инфляционное исключение. - person Cilenco; 19.06.2020

И здесь селектор тоже является ответом.

Найдите в источниках Bright_text_dark_focused.xml, добавьте в свой проект в каталоге res/color, а затем обратитесь к TextView как

android:textColor="@color/bright_text_dark_focused"
person yanchenko    schedule 14.08.2009
comment
Я думаю, что это изменилось на primary_text_dark_focused.xml. - person greg7gkb; 21.12.2010
comment
Это просто поразило меня. Все это время я работал со слушателями, чтобы изменить цвет текста. Челюсть на полу. Великолепно! - person Artem Russakovskii; 07.04.2011
comment
Никогда не думал, что селекторы также работают для textColor, очень просто. - person Drejc; 14.02.2012
comment
Я попробовал это с корневым макетом представления, которое я сделал для своего ListFragment, и в итоге получил кучу ошибок. Что я делаю неправильно? - person MowDownJoe; 03.04.2013
comment
мы не можем использовать @android:color/white там... отображение помощи по содержимому недоступно, когда я нажимаю Ctrl + пробел - person LOG_TAG; 06.03.2014
comment
О боже, все эти годы я жил в темноте! Черт! Это очень хорошо! Работает как шарм! - person sud007; 02.11.2020

Вот моя реализация, которая ведет себя точно так же, как элемент в списке (по крайней мере, на 2.3)

res/layout/list_video_footer.xml

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

    <TextView
        android:id="@+id/list_video_footer"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@android:drawable/list_selector_background"
        android:clickable="true"
        android:gravity="center"
        android:minHeight="98px"
        android:text="@string/more"
        android:textColor="@color/bright_text_dark_focused"
        android:textSize="18dp"
        android:textStyle="bold" />

</FrameLayout>

разрешение/цвет/bright_text_dark_focused.xml

<?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 kreker    schedule 15.12.2011
comment
Это хорошо сработало для меня, и в моем случае сработало очень хорошо для настройки выделенных/невыделенных цветов для моей реализации TabHost. - person oddmeter; 04.12.2015

Чтобы заставить его работать при выборе в представлении списка, используйте следующий код:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="#fff"/>
    <item android:state_activated="true" android:color="#fff"/>
    <item android:color="#000" />
</selector>

По-видимому, ключ находится в состоянии state_activated="true".

person Manuel Escrig    schedule 07.10.2014
comment
Не забудьте поместить этот файл в папку res/color - person Nguyen Minh Binh; 30.06.2016

Вот пример селектора. Если вы используете eclipse , он ничего не предлагает, когда вы нажимаете ctrl и пробел: / вы должны ввести его.

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/btn_default_pressed" android:state_pressed="true" />
<item android:drawable="@drawable/btn_default_selected"
    android:state_focused="true"
    android:state_enabled="true"
    android:state_window_focused="true"  />
<item android:drawable="@drawable/btn_default_normal" />

You can look at for reference;

http://developer.android.com/guide/topics/resources/drawable-resource.html#StateList

person Günay Gültekin    schedule 04.04.2012

В res/color поместите файл "text_selector.xml":

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/blue" android:state_focused="true" />
    <item android:color="@color/blue" android:state_selected="true" />
    <item android:color="@color/green" />
</selector>

Затем в TextView используйте его:

<TextView
    android:id="@+id/value_1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Text"
    android:textColor="@color/text_selector"
    android:textSize="15sp"
    />

И в коде вам нужно установить прослушиватель кликов.

private var isPressed = false

private fun TextView.setListener() {
    this.setOnClickListener { v ->
        run {
            if (isPressed) {
                v.isSelected = false
                v.clearFocus()
            } else {
                v.isSelected = true
                v.requestFocus()
            }
            isPressed = !isPressed
        }
    }
}

override fun onResume() {
    super.onResume()
    textView.setListener()
}

override fun onPause() {
    textView.setOnClickListener(null)
    super.onPause()
}

Извините, если есть ошибки, я изменил код перед публикацией и не проверил.

person CoolMind    schedule 19.03.2019

Я всегда использовал вышеуказанное решение, не ища больше после этого. ;-)

Однако сегодня я наткнулся на кое-что и решил поделиться этим. :)

Эта функция действительно доступна в API 1 и называется ColorStateList, где мы можем указать цвет для различных состояний виджетов (как мы уже знаем).

Он также очень хорошо документирован, здесь.

person Atul O Holic    schedule 28.03.2014

Если использовать TextViews на вкладках, это определение селектора сработало для меня (попробовал Клауса Балдуино, но это не сработало):

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

  <!--  Active tab -->
  <item
    android:state_selected="true"
    android:state_focused="false"
    android:state_pressed="false"
    android:color="#000000" />

  <!--  Inactive tab -->
  <item
    android:state_selected="false"
    android:state_focused="false"
    android:state_pressed="false"
    android:color="#FFFFFF" />

</selector>
person samis    schedule 13.06.2014

Вы пробовали setOnFocusChangeListener? В обработчике вы можете изменить внешний вид текста.

Например:

TextView text = (TextView)findViewById(R.id.text);
text.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            ((TextView)v).setXXXX();
        } else {
            ((TextView)v).setXXXX();
        }
    }
});

Затем вы можете применить любые изменения, которые вы хотите, независимо от того, сфокусирован он или нет. Вы также можете использовать ViewTreeObserver для прослушивания глобальных изменений фокуса.

Например:

View all = findViewById(R.id.id_of_top_level_view_on_layout);
ViewTreeObserver vto = all.getViewTreeObserver();
vto.addOnGlobalFocusChangeListener(new ViewTreeObserver.OnGlobalFocusChangeListener() {
    public void onGlobalFocusChanged(
        View oldFocus, View newFocus) {
        // xxxx
    }
});

Я надеюсь, что это поможет или даст вам идеи.

person lilbyrdie    schedule 06.08.2009
comment
Сначала я пошел по этому пути, но цвет текста почему-то не изменился. - person yanchenko; 15.08.2009