web-dev-qa-db-fra.com

Utilisation du sélecteur pour changer la couleur du texte TextView

J'essaie d'utiliser un TextView pour définir le style d'un TabWidget sur un Tabhost.

Je viens de créer un sélecteur pour bgcolor et cela fonctionne bien, mais je veux créer un sélecteur pour textColor mais la couleur du texte ne change pas:

Voici mon tab_text_selector.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="@Android:color/white" />
    <item Android:state_focused="true" Android:color="@Android:color/white" />
    <item Android:state_pressed="true" Android:color="@Android:color/white" />

</selector>

Et voici le code lorsque j'essaie d'utiliser un fichier textView:

TextView txtTab=new TextView(this);
        txtTab.setTextColor(R.drawable.tab_text_selector);
        txtTab.setBackgroundResource(R.drawable.tab_bg_selector);
        txtTab.setGravity(Gravity.CENTER);
        txtTab.setText("Agregar Idea");

Je sais que la couleur du texte doit être blanche dans tous les cas, mais ce n'est pas le cas.

39
rafuru

Vous devez utiliser getColorStateList () . Et pour XML, voir ici .

Je me battais aussi avec ce problème. Si vous souhaitez utiliser un state list, vous devez le déclarer dans le dossier color resources, au lieu du dossier drawable, et utiliser la méthode setTextColor(getResources().getColorStateList(R.color.tab_text_selector)).

48
ffleandro

1) Utilisez tab_text_selector.xml comme ci-dessous et placez-le dans le dossier res/color:

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_selected="true" Android:color="@Android:color/white" />
    <item Android:state_focused="true" Android:color="@Android:color/white" />
    <item Android:state_pressed="true" Android:color="@Android:color/white" />
    <item Android:color="#504f4f" /> <!-- default case -->
</selector>

Et réglez-le sur votre texte comme ci-dessous.

TextView tv = (TextView) findViewById(R.id.TextView1) ;
tv.setTextColor(context.getResources().getColor(R.color.tab_text_selector));

2) La deuxième option est Si vous utilisez textview dans XML plutôt que de manière programmée, utilisez tab_text_selector.xml comme ci-dessous:

<TextView
    Android:id="@+id/textView1"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:gravity="center_horizontal"
    Android:text="TextView"
    Android:textColor="@‌​drawable/tab_text_sel‌​ector" />
81
Sagar Shah

Utilisez cette manière:

tab_text_selector.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="#FF111111"/>  
    <item Android:state_focused="true" Android:color="#FF222222"/>    
    <item Android:state_selected="true" Android:color="#FF333333"/> 
</selector>

Affichage:

TextView txtTab = new TextView(this);

XmlResourceParser xrp = getResources().getXml(R.drawable.tab_text_selector);  
try {  
    ColorStateList csl = ColorStateList.createFromXml(getResources(), xrp);  
    txtTab.setTextColor(csl);  
} catch (Exception e) {  } 

txtTab.setBackgroundResource(R.drawable.tab_bg_selector);
txtTab.setGravity(Gravity.CENTER);
txtTab.setText("Agregar Idea");

Mais il vaut mieux mettre de la couleur dans /res/color/yourcolor.xml

29
ρяσѕρєя K

Il suffit de faire sélecteur pour textcolor 

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_pressed="true" Android:color="@color/drawer_color" />
<item Android:state_focused="false" Android:color="@Android:color/white" />
<item Android:state_selected="true" Android:color="@color/drawer_color" />

Puis définissez la propriété textColor de Textview avec un ensemble clickable = true

<TextView
    Android:clickable="true"
    Android:textColor="@drawable/text_selector"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="@string/registration"
    Android:layout_alignParentRight="true"
    Android:layout_alignParentEnd="true" />
10
user2776223

@ ffleandro, @ ρяσѕρєя K répond à la meilleure variante, je pense que l'utilisation du meilleur choix de ColorStateList avec les versions les plus anciennes et les plus récentes d'Android.

int[][] states = new int[][] {
    new int[] { Android.R.attr.state_pressed}, // pressed
    new int[] { Android.R.attr.state_focused}, // focused
    new int[] {}
};
int[] colors = new int[] {
    getResources().getColor(R.color.green_color), // green
    getResources().getColor(R.color.green_color), // green
    getResources().getColor(R.color.white)  // white
};
ColorStateList list = new ColorStateList(states, colors);
mTextView.setFocusable(true);
mTextView.setClickable(true);
mTextView.setTextColor(list);
5
mr.boyfox
<item Android:state_selected="true" Android:color="@Android:color/white" />
<item Android:state_focused="true" Android:color="@Android:color/red" />
<item Android:state_pressed="true" Android:color="@Android:color/blue" />
2
Samir Mangroliya

Voici la référence sur les développeurs Android http://developer.Android.com/guide/topics/resources/color-list-resource.html

1
snapix

Créez un sélecteur (text_color_selector.xml) et placez-le dans le dossier res/color:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:color="@color/colorPrimary" Android:state_pressed="true" /> <!-- pressed -->
    <item Android:color="@color/colorPrimary" Android:state_focused="true" /> <!-- focused -->
    <item Android:color="@color/light_gray_b" /> <!-- default -->
</selector>

ajoutez ceci dans votre Textview en tant que:

        <TextView
            Android:id="@+id/tvMenuName"
            style="@style/TextViewStyle"
            Android:layout_marginLeft="@dimen/dimen_15"
            Android:layout_marginStart="@dimen/dimen_15"
            Android:textColor="@color/text_color_selector"
            Android:textSize="@dimen/text_size_16"
            tools:text="Home" />

par programmation, vous pouvez définir Textview comme ceci:

TextView tv = (TextView) findViewById(R.id.textView) ;
tv.setTextColor(context.getResources().getColor(R.color.text_color_selector));

J'espère que ça aide.

1
Rahul

Vous avez utilisé la couleur blanche dans tous les cas. Sélectionnez, puis appuyez sur.

S'il vous plaît utiliser et tester avec une couleur différente.

Doit également utiliser une casse par défaut avec une certaine couleur, par exemple black, avec la casse tout .. quand aucun état n'est utilisé, la valeur par défaut sera appliquée.

0
Arpit Garg

Solution la plus simple et efficace:

  1. créez votre sélecteur de couleur XML dans res/color/your_color.xml
  2. Utilisez ContextCompat util 

Ex .: txtview.setTextColor (ContextCompat.getColorStateList (context, R.color.tab_tv_selector));

0