Android angepasste Schaltfläche; Ändern der Textfarbe

251

Ich habe eine Schaltfläche erstellt, die den Hintergrund ändert, der in verschiedenen Zuständen gezeichnet werden kann:

 <selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:state_pressed="true" android:drawable="@drawable/btn_location_pressed" /> <!-- pressed -->
 <item android:state_focused="true" android:drawable="@drawable/btn_location_pressed"/> <!-- focused -->
 <item android:drawable="@drawable/btn_location"/> <!-- default -->

Das Problem hier ist, dass ich auch versuche, die textColor zu ändern, wie ich es mit dem Drawable mache, aber ich kann es nicht. Ich habe bereits android: textColor und android: color ausprobiert, aber das erste funktioniert nicht, während das zweite meinen Hintergrund ändert.

Der nächste Code ist Teil meines Layouts. In Bezug auf die Textfarbe funktioniert dies nur für die normale Textfarbe, sodass sie beim Drücken nicht in die weiße geändert wird

<Button android:id="@+id/location_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingTop="5dp"
        android:background="@drawable/location"          
        android:textSize="15sp"
        android:textColor="@color/location_color"
        android:textColorHighlight="#FFFFFF"
   />

Hat jemand eine Ahnung?

Dwbrito
quelle

Antworten:

579

Erstellen Sie eine zustandsbehaftete Farbe für Ihre Schaltfläche, genau wie für den Hintergrund, zum Beispiel:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Focused and not pressed -->
    <item android:state_focused="true" 
          android:state_pressed="false" 
          android:color="#ffffff" />

    <!-- Focused and pressed -->
    <item android:state_focused="true" 
          android:state_pressed="true" 
          android:color="#000000" />

    <!-- Unfocused and pressed -->
    <item android:state_focused="false" 
          android:state_pressed="true" 
          android:color="#000000" />

    <!-- Default color -->
    <item android:color="#ffffff" />

</selector>

Platzieren Sie die XML in einer Datei im Ordner res / drawable, dh res / drawable / button_text_color.xml. Dann stellen Sie das Zeichen einfach als Textfarbe ein:

android:textColor="@drawable/button_text_color"
Konstantin Burov
quelle
15
Beachten Sie, dass (zumindest für mich) ein Fehler vorliegt, bei dem der "normale" Status (<item android: color = "# ffffff" /> in Ihrer Antwort) wie in Ihrer Antwort am Ende der Datei stehen muss. Wenn Sie den Normalzustand oben in der Datei (über den anderen Zuständen) platzieren, funktioniert der Selektor nicht mehr.
Chris Blunt
58
Es ist kein Fehler. So soll die Statusauswahl funktionieren. Es ist kein bestes Spiel , stattdessen schafft es das erste, das passt.
Superjos
Wie geht das mit einem ganzzahligen Wert? Ich versuche etwas Ähnliches mit dem Textauffüllen zu tun.
Elimirks
verbrachte einige Zeit damit, dies ohne Erfolg zu versuchen, und stellte dann fest, dass ich es immer noch auf die Eigenschaft background anstatt auf die Eigenschaft textcolor gesetzt hatte. Ich bin es nicht gewohnt zu sehen, wie Textfarben gezeichnet werden!
Odaym
20
Es ist besser, wenn sich die Farbauswahl im res/colorOrdner befindet. Und wenn Sie anrufen, verwenden Sie:android:textColor="@color/button_text_color"
Justin
16

Ein anderer Weg, dies zu tun, ist in Ihrer Klasse:

import android.graphics.Color; // add to top of class  

Button btn = (Button)findViewById(R.id.btn);

// set button text colour to be blue
btn.setTextColor(Color.parseColor("blue"));

// set button text colour to be red
btn.setTextColor(Color.parseColor("#FF0000"));

// set button text color to be a color from your resources (could be strings.xml)
btn.setTextColor(getResources().getColor(R.color.yourColor));

// set button background colour to be green
btn.setBackgroundColor(Color.GREEN);
Michael Yaworski
quelle
1
Dadurch wird die Textfarbe auf der Schaltfläche geändert, diese Farbe bleibt jedoch während der verschiedenen Zustände der Schaltfläche (z. B. gedrückt) erhalten. In den meisten Szenarien, in denen sich die Hintergrundfarbe einer Schaltfläche während eines Status ändert, ist es auch erwünscht, auch die Textfarbe der Schaltfläche zu ändern. Hier ist die Antwort von @Konstantin Burov hilfreich.
Dzhuneyt
1
Dies beantwortet nicht die ursprüngliche Frage. Die Frage ist, wie zustandsbasierte Farben für eine Textansicht definiert werden können, genau wie Sie zustandsbasierte Zeichen festlegen können.
Alchemist
4

ok sehr einfach gehe zuerst zu 1. res-valuse und öffne colours.xml 2.copy 1 des definierten textes ihr zum beispiel # FF4081 und ändere den namen zum beispiel ich habe mich in weiß geändert und seinen wert zum änderen ich zum ändere ich habe mich in #FFFFFF geändert für Weißwert wie dieser

<color name="White">#FFFFFF</color>

Fügen Sie dann innerhalb Ihrer Schaltfläche diese Zeile hinzu

 b3.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.White));

ok b3 ist der Name meiner Schaltfläche, also wird der Name Ihrer Schaltfläche geändert. Alle anderen sind gleich, wenn Sie die weiße Farbe verwenden, wenn Sie eine andere Farbe ändern, dann ändern Sie Weiß in den Namen Ihrer Farbe, aber zuerst müssen Sie diese Farbe in Farben definieren. xml wie ich in pont 2 erklärt habe

Ich suche Wissen
quelle
1

Ändern der Textfarbe der Schaltfläche

Weil diese Methode jetzt veraltet ist

button.setTextColor(getResources().getColor(R.color.your_color));

Ich benutze folgendes:

button.setTextColor(ContextCompat.getColor(mContext, R.color.your_color));
Gjoko Bozinov
quelle
0

Verwenden Sie getColorStateListso

setTextColor(resources.getColorStateList(R.color.button_states_color))

anstatt getColor

setTextColor(resources.getColor(R.color.button_states_color))
Li Jin
quelle