Sélecteur Android et couleur du texte

187

Je veux un simple TextViewpour se comporter comme simple_list_item_1dans un ListViewfait. Voici le 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" />

Tout fonctionne à l'exception de la couleur du texte qui (normalement) ne change pas en état focalisé. Comment le changer en textAppearanceLargeInverse?

Yanchenko
la source
Au cas où quelqu'un chercherait le fichier xml, c'est ici: developer.android.com/resources/samples/Home/res/color/…
swinefeaster

Réponses:

406

J'ai réussi à faire plusieurs tests jusqu'à ce que l'un d'eux fonctionne, donc: 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
la source
8
sans l'androïde: drawable l'application plante avec ce sélecteur xml
neufuture
4
@neufuture: vous devez utiliserandroid:textColor="@color/button_dark_text"
Paul
3
Il existe un document décrivant les listes des états de couleur: developer.android.com/guide/topics/resources/…
Rick77
Par curiosité, cela fonctionne également lorsque le texte, le bouton ou tout élément a été activé, par exemple pour un élément de liste. <item android: state_activated = "true" android: color = "@ android: color / white" />
jiahao
Le sélecteur doit-il vraiment résider sous le res/colordossier?
mr5
80

Et le sélecteur est la réponse ici aussi.

Recherchez bright_text_dark_focused.xml dans les sources, ajoutez à votre projet sous le répertoire res / color, puis faites référence à TextView comme

android:textColor="@color/bright_text_dark_focused"
Yanchenko
la source
5
Je pense que cela a changé en "primary_text_dark_focused.xml".
greg7gkb
12
Cela m'a époustouflé. J'ai manipulé des choses avec les auditeurs pour changer la couleur du texte tout ce temps. Mâchoire au sol. Brillant!
Artem Russakovskii
Jamais pensé que les sélecteurs fonctionnent également pour textColor, super facile.
Drejc
J'ai essayé cela avec la mise en page racine d'une vue que j'ai faite pour mon ListFragment, et j'ai fini avec un tas d'erreurs . Qu'est-ce que je fais mal?
MowDownJoe
nous ne pouvons pas utiliser @android: color / white là-bas .. L'affichage de l'assistance au contenu n'est pas disponible lorsque j'appuie sur Ctrl + espace
LOG_TAG
31

Voici mon implémentation, qui se comporte exactement comme un élément de la liste (au moins sur 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
la source
Cela a bien fonctionné pour moi et, dans mon cas, a très bien fonctionné pour ajuster les couleurs surlignées / non surlignées pour mon implémentation
TabHost
29

Afin de le faire fonctionner sur la sélection dans une vue de liste, utilisez le code suivant:

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

Apparemment, la clé est l' state_activated="true"état.

Manuel Escrig
la source
17
N'oubliez pas de placer ce fichier dans le dossier res / color
Nguyen Minh Binh
4

Voici l'exemple du sélecteur. Si vous utilisez eclipse, cela ne suggère rien lorsque vous cliquez sur ctrl et espace à la fois: / vous devez le saisir.

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

Vous pouvez regarder pour référence;

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

Günay Gültekin
la source
2

J'ai toujours utilisé la solution ci-dessus sans chercher plus après cela. ;-)

Cependant, aujourd'hui je suis tombé sur quelque chose et j'ai pensé le partager. :)

Cette fonctionnalité est en effet disponible à partir de l'API 1 et s'appelle ColorStateList , où nous pouvons fournir une couleur à différents états de Widgets (comme nous le savons déjà).

Il est également très bien documenté, ici.

Atul O Holic
la source
2

En res/colorplace un fichier "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>

Ensuite, TextViewutilisez-le:

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

Et dans le code, vous devrez définir un écouteur de clic.

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

Désolé s'il y a des erreurs, j'ai changé un code avant de publier et je n'ai pas vérifié.

CoolMind
la source
1

Si vous utilisez TextViews dans les onglets, cette définition de sélecteur a fonctionné pour moi (j'ai essayé celle de Klaus Balduino mais ce n'est pas le cas):

<?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 est
la source
0

Avez-vous essayé setOnFocusChangeListener? Dans le gestionnaire, vous pouvez modifier l'apparence du texte.

Par exemple:

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

Vous pouvez ensuite appliquer les modifications souhaitées, qu'elles soient ciblées ou non. Vous pouvez également utiliser le ViewTreeObserver pour écouter les changements de focus global.

Par exemple:

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

J'espère que cela vous aidera ou vous donnera des idées.

Lilbyrdie
la source
1
J'ai choisi cette voie au départ, mais la couleur du texte n'a pas changé pour une raison quelconque.
yanchenko