Ich habe eine anklickbare Textansicht, der ich einige Farben geben möchte. Aber ich weiß nicht wie. Hier sind die relevanten Codeausschnitte aus meinen beiden Dateien, mit denen ich arbeite:
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 */
}
});
Und das ist meine textcolor.xml-Datei:
<?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>
Wenn ich die textcolor-Datei verwende, tippe title.setTextColor (R.color.textcolor); , die Textfarbe wird grau, egal ob ich sie drücke oder so. Was seltsam ist, da ich in allen Farbfeldern "# 000000" geschrieben habe.
Wenn ich den setTextColor-Code entferne, erhält das TextView eine hellgraue Farbe, und wenn ich es drücke, wird es schwarz. Aber das sind nicht die Farben, die ich will.
Kann mir jemand bei diesem Problem helfen?
Nur zur Klarstellung: Ich möchte in der Lage sein, die Farben für den Text festzulegen, wenn er normal, gedrückt und fokussiert ist.
Wenn Sie Stateful-Farbe aus dem Code setzen möchten, müssen Sie ColorStateList
als Argument an setTextColor
übergeben, wobei ein Int an die Methode übergeben wird, indem Sie die Farbe auf alle Status setzen. Es sieht auch so aus, als ob Ihre XML nicht ganz korrekt ist. Beispiel aus ColorStateList
docs sieht folgendermaßen aus (sollte wie folgt aussehen: 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 zum Einstellen einer ColorStateList
auf die Textfarbe:
ColorStateList cl = null;
try {
XmlResourceParser xpp = getResources().getXml(R.color.selector_txt);
cl = ColorStateList.createFromXml(getResources(), xpp);
} catch (Exception e) {}
Hinweis: Die Methode createFromXml(Resources, XmlPullParser parser)
wurde in API-Ebene 23 abgelehnt Verwendung createFromXml(Resources, XmlPullParser parser, Theme)
Mit XML ist es so einfach wie:
Android:textColor="@color/selector_txt"
Schritt 1: Legen Sie die Textfarbe wie folgt in XML fest
Android: textColor = "@ color/text_color"
Schritt 2: Erstellen Sie 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>
Versuchen Sie es mit diesem. Es hat für mich funktioniert:
Dateiname: 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>
Stellen Sie die Farbe im XML-Layout folgendermaßen ein:
Android:textColor="@color/bg_tab_text_color"
Schauen Sie in der R.Java-Klasse (sie wird automatisch generiert). Sie haben so etwas:
public static final class color {
public static final int gray_transparent=0x7f050001;
}
Also in deinem Code in der Zeile:
title.setTextColor(R.color.textcolor);
sie setzen keine Werte aus textcolor.xml, sondern int aus R.Java (die Adresse von textcolor.xml enthält). Die gültige Methode zum Einstellen der Farbe ist:
title.setTextColor(getResources().getColorStateList(R.color.textcolor));
Es ist sehr einfach. Versuchen Sie es mit diesem. Es hat bei mir funktioniert:
Dateiname: 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" />
Stellen Sie die Farbe im XML-Layout folgendermaßen ein:
Android:textColor="@color/bg_tab_text_color"
Hier ist ein sehr einfacher Weg programmgesteuert:
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);
}
In 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" />
In 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>
Im Layout:
<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"/>
In Code:
textView.setSelected(false); // To deselect.
textView.setSelected(true);