J'ai un TextView cliquable que je veux donner des couleurs. Mais je ne sais pas comment. Voici les extraits de code pertinents de mes deux fichiers avec lesquels je travaille:
TextView title = new TextView(this);
title.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
title.setTextColor(R.color.textcolor);
title.setText(titleLine);
title.setTypeface(null, Typeface.BOLD);
title.setClickable(true);
title.setId(idLine);
title.setFocusable(true);
title.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/* Irrelevant code */
}
});
Et voici mon fichier textcolor.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="#000000"/> <!-- default -->
</selector>
Quand j'utilise le fichier textcolor en tapant title.setTextColor (R.color.textcolor); , la couleur du texte devient simplement grise, que j'appuie ou non. Ce qui est étrange puisque j'ai écrit "# 000000" dans tous les champs de couleur.
Mais si je supprime le code setTextColor, le textView devient gris clair et lorsque je l’applique, il devient noir. Mais ce ne sont pas les couleurs que je veux.
Alors, est-ce que quelqu'un peut m'aider avec ce problème?
Juste pour clarifier: je veux pouvoir spécifier les couleurs du texte quand il est normal, pressé et concentré.
Si vous souhaitez définir une couleur avec code à partir du code, vous devez passer ColorStateList
en tant qu'argument pour setTextColor
en passant un int à la méthode, vous définissez la couleur sur tous les états. Il semble également que votre code XML n'est pas totalement correct. Exemple de ColorStateList
docs ressemble à (devrait être situé comme ceci: res/color/selector_txt.xml
):
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_focused="true" Android:color="@color/testcolor1"/>
<item Android:state_pressed="true" Android:state_enabled="false" Android:color="@color/testcolor2" />
<item Android:state_enabled="false" Android:color="@color/testcolor3" />
<item Android:color="@color/testcolor5"/>
</selector>
UPD sur la manière de définir une ColorStateList
sur la couleur du texte:
ColorStateList cl = null;
try {
XmlResourceParser xpp = getResources().getXml(R.color.selector_txt);
cl = ColorStateList.createFromXml(getResources(), xpp);
} catch (Exception e) {}
Remarque: la méthode createFromXml(Resources, XmlPullParser parser)
était obsolète dans l'API de niveau 23 . Utilisez createFromXml(Resources, XmlPullParser parser, Theme)
Avec XML, c'est aussi simple que:
Android:textColor="@color/selector_txt"
Étape 1: Définissez la couleur du texte en xml comme ceci
Android: textColor = "@ color/text_color"
Étape 2: Créer res/color/text_color.xml
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item Android:state_pressed="true"
Android:color="#ffffffff"/> <!-- pressed -->
<item Android:state_focused="true"
Android:color="#ff0000ff"/> <!-- focused -->
<item Android:color="#ff000000"/> <!--default -->
</selector>
Essayez celui-ci .. Cela a fonctionné pour moi:
Nom du fichier: res/color/bg_tab_text_color.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_pressed="false" Android:state_selected="false" Android:color="@color/tab_unselected_text_color"/>
<item Android:state_pressed="true" Android:color="@color/tab_selected_text_color"/>
<item Android:state_pressed="false" Android:state_selected="true" Android:color="@color/tab_selected_text_color"/>
<item Android:color="@color/tab_unselected_text_color"></item>
</selector>
Essayez de définir la couleur dans la disposition XML comme suit:
Android:textColor="@color/bg_tab_text_color"
Regardez dans la classe R.Java (elle est générée automatiquement). Vous avez quelque chose comme ça:
public static final class color {
public static final int gray_transparent=0x7f050001;
}
Donc dans votre code en ligne:
title.setTextColor(R.color.textcolor);
vous ne définissez pas les valeurs de textcolor.xml mais int de R.Java (qui contient l'adresse textcolor.xml). La méthode valide pour définir la couleur est la suivante:
title.setTextColor(getResources().getColorStateList(R.color.textcolor));
C'est très facile. Essayez celui-ci .. Cela a fonctionné pour moi:
Nom du fichier: res/color/bg_tab_text_color.xml
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_pressed="true" Android:drawable="@color/blue" />
Essayez de définir la couleur dans la disposition XML comme suit:
Android:textColor="@color/bg_tab_text_color"
Voici un moyen très simple par programme:
private void setColorStateList(TextView view) {
int[][] states = new int[][] {
new int[] { Android.R.attr.state_pressed}, // pressed
new int[] { Android.R.attr.state_focused}, // focused
new int[] { Android.R.attr.state_enabled} // enabled
};
int[] colors = new int[] {
getResources().getColor(R.color.blue),
getResources().getColor(R.color.green),
getResources().getColor(R.color.green)
};
ColorStateList list = new ColorStateList(states, colors);
view.setTextColor(list);
view.setClickable(true);
view.setFocusableInTouchMode(true);
}
Dans res/drawable/tab_textColor.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="#FFFFFF" />
<item Android:state_pressed="true" Android:color="#FFFFFF" />
<item Android:color="#CCCCCC" />
</selector>
<TextView
Android:id="@+id/title"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/icon"
Android:layout_centerHorizontal="true"
Android:layout_marginTop="5dp"
Android:text="@string/tab_indicator_home"
Android:textColor="@drawable/tab_textcolor"
Android:textSize="10sp"
Android:visibility="visible"
tools:ignore="SmallSp" />
Dans res/color/text_selector.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:color="@color/white"
Android:state_selected="true"/>
<item Android:color="#8020e0"/>
</selector>
En mise en page:
<TextView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Word"
Android:textColor="@color/text_selector"
Android:textSize="12sp"/>
Dans du code:
textView.setSelected(false); // To deselect.
textView.setSelected(true);