Selector de Android y color de texto


184

Quiero un simple TextViewpara comportarse de la manera simple_list_item_1en un ListViewhace. Aquí está el 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" />

Todo funciona excepto el color del texto que (como se espera) no cambia en el estado enfocado. ¿Cómo hago que cambie textAppearanceLargeInverse?


En caso de que alguien esté buscando el archivo xml, está aquí: developer.android.com/resources/samples/Home/res/color/…
swinefeaster

Respuestas:


404

Obtuve varias pruebas hasta que una funcionó, así que: 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>

res / layout / 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>

8
sin el androide: dibujable, la aplicación se bloquea con este selector xml
actualización

44
@neufuture: necesitas usarandroid:textColor="@color/button_dark_text"
Paul

3
Hay un documento que describe las listas de estados de color: developer.android.com/guide/topics/resources/…
Rick77

Como curiosidad, también funciona cuando el texto, botón o cualquier elemento se ha activado, por ejemplo, para el elemento de la lista. <item android: state_activated = "true" android: color = "@ android: color / white" />
jiahao

¿Debería el selector residir realmente en la res/colorcarpeta?
mr5

79

Y el selector es la respuesta aquí también.

Busque bright_text_dark_focused.xml en las fuentes, agréguelo a su proyecto en el directorio res / color y luego consulte TextView como

android:textColor="@color/bright_text_dark_focused"

55
Creo que esto ha cambiado a "primary_text_dark_focused.xml".
greg7gkb

11
Esto me dejó alucinado. He estado manejando cosas con los oyentes para cambiar el color del texto todo este tiempo. Mandíbula en el piso. ¡Brillante!
Artem Russakovskii

Nunca pensé que los selectores también funcionan para textColor, súper fácil.
Drejc

Intenté esto con el diseño raíz de una vista que hice para mi ListFragment, y terminé con un montón de errores . ¿Qué estoy haciendo mal?
MowDownJoe

no podemos usar @android: color / blanco allí ... mostrar asistencia de contenido no disponible cuando
presiono

31

Aquí está mi implementación, que se comporta exactamente como elemento en la lista (al menos en 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>

res / color / 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>

Esto funcionó bien para mí, y en mi caso funcionó bastante bien para ajustar los colores resaltados / no resaltados para mi implementación
TabHost

27

Para que funcione en la selección en una vista de lista, use el siguiente código:

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

Al parecer, la clave es el state_activated="true"estado.


17
No olvide colocar este archivo en la carpeta res / color
Nguyen Minh Binh

4

Aquí está el ejemplo de selector. Si usa eclipse, no sugiere algo cuando hace clic en ctrl y espacia ambos: / debe escribirlo.

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

Puedes mirar para referencia;

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


2

Siempre usé la solución anterior sin buscar más después de esto. ;-)

Sin embargo, hoy me encontré con algo y pensé en compartirlo. :)

Esta característica está disponible en la API 1 y se llama ColorStateList , donde podemos suministrar un color a varios estados de Widgets (como ya sabemos).

También está muy bien documentado, aquí.


2

En el res/colorlugar un archivo "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>

Luego en TextViewuso:

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

Y en el código deberá configurar un escucha de clics.

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

Lo sentimos si hay errores, cambié un código antes de publicar y no lo verifiqué.


1

Si usar TextViews en pestañas esta definición de selector funcionó para mí (probé con Klaus Balduino pero no fue así):

<?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>

0

¿Lo has intentado setOnFocusChangeListener? Dentro del controlador, puede cambiar la apariencia del texto.

Por ejemplo:

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

Luego puede aplicar los cambios que desee cuando esté enfocado o no. También puede usar ViewTreeObserver para escuchar los cambios de enfoque global.

Por ejemplo:

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

Espero que esto ayude o te de ideas.


1
Inicialmente he seguido este camino, pero el color del texto no cambió por alguna razón.
Yanchenko
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.