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?


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>

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"

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>

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.


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


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.


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


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>

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.


1
J'ai choisi cette voie au départ, mais la couleur du texte n'a pas changé pour une raison quelconque.
yanchenko
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.