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?

Yanchenko
fuente
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>
Klaus Balduino
fuente
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"
Yanchenko
fuente
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>
kreker
fuente
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.

Manuel Escrig
fuente
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

Günay Gültekin
fuente
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í.

Atul O Holic
fuente
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é.

CoolMind
fuente
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>
Sam es
fuente
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.

lilbyrdie
fuente
1
Inicialmente he seguido este camino, pero el color del texto no cambió por alguna razón.
Yanchenko