Android: Wo versteckt sich das Textfarbenattribut des Spinner-Widgets?

77

Ich versuche, die Textfarbe des einzelnen Elements zu ändern, das in der Drehschaltfläche angezeigt wird, nachdem Sie ein Element aus der Dropdown-Liste ausgewählt haben. Ich habe jetzt eine Stunde lang die Themen.xml und Styles.xml im Android SDK durchgesehen und kann anscheinend nicht herausfinden, woher der Spinner den Farbwert bezieht.

Zur Verdeutlichung versuche ich NICHT, die Farbe eines Dropdown-Elements zu ändern. Ich versuche, die Farbe des angezeigten Textes des Spinners zu ändern, wenn kein Dropdown vorhanden ist. Ich denke, man könnte es den "Button" -Text des Spinners nennen.

Christopher Perry
quelle
1
Es gibt eine Farbe und einen Hintergrund für den Text in einem Spinner. Sie können es in SpinnerAdapter.getView () festlegen.
Ray Tayek

Antworten:

108

Ich denke, es ist wahrscheinlich dieses Bit in styles.xml

<style name="Widget.TextView.SpinnerItem">
    <item name="android:textAppearance">@style/TextAppearance.Widget.TextView.SpinnerItem</item>
</style>
<style name="Widget.DropDownItem.Spinner">
    <item name="android:checkMark">?android:attr/listChoiceIndicatorSingle</item>
</style>

- = EDIT = - Hier ist das Ergebnis: Geben Sie hier die Bildbeschreibung ein

und so geht's:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MooTheme" parent="android:Theme">
        <item name="android:spinnerItemStyle">@style/MooSpinnerItem</item>
    </style>

    <style name="MooSpinnerItem" parent="android:Widget.TextView.SpinnerItem">
        <item name="android:textAppearance">@style/MooTextAppearanceSpinnerItem</item>
    </style>

    <style name="MooTextAppearanceSpinnerItem" parent="android:TextAppearance.Widget.TextView.SpinnerItem">
        <item name="android:textColor">#F00</item>
    </style>
</resources>

Fügen Sie dies dann einfach dem Anwendungs-Tag in Ihrer AndroidManifest.xml hinzu

android:theme="@style/MooTheme"
CaseyB
quelle
Das ist für die Spinner-Gegenstände, die in der Dropdown-Liste stehen. Ich brauche es für den Text im eigentlichen Spinner.
Christopher Perry
Das ist der eigentliche Spinner. Ich bearbeite meine Antwort mit der vollständigen Implementierung.
CaseyB
1
Ich verstehe nicht, weil dies besagt, dass es für die Spinner-Gegenstände ist. Wie wird dies auf den Spinner angewendet? Ich sehe, dass es tatsächlich funktioniert, also werde ich deins als Antwort markieren, aber ich bin wirklich neugierig, wie das tatsächlich funktioniert, weil ich im Spinner-Code nachgesehen habe, wo der Text angezeigt wird und wo er sich befindet ein Verlust, es zu finden.
Christopher Perry
Kannst du mir sagen, wie man ein benutzerdefiniertes Dreieck auf der rechten Seite des Spenders erstellt?
Pengwang
1
@pengwang ist Teil des neun Patch-Hintergrunds, der für Spinner gezeichnet werden kann.
Christopher Perry
52

Ja, CaseyB ist richtig.

So stelle ich die Spinner-Textfarbe ein, ein kleines einfaches Beispiel:

styles.xml

    <style name="Theme.NoTitleBar.WithColoredSpinners" parent="@android:style/Theme.NoTitleBar">
        <item name="android:spinnerItemStyle">@style/SpinnerItem</item>
        <item name="android:spinnerDropDownItemStyle">@style/SpinnerItem.DropDownItem</item>
    </style>

    <style name="SpinnerItem" parent="@android:style/Widget.TextView.SpinnerItem">
        <item name="android:textColor">#00FF00</item>
    </style>

    <style name="SpinnerItem.DropDownItem" parent="@android:style/Widget.DropDownItem.Spinner">
        <item name="android:textColor">#FF0000</item>
    </style>

</resources>

Dann in Ihrem Manifest:

<application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.NoTitleBar.WithColoredSpinners" >

Der Text auf der Außenseite aller Ihrer Spinner ist jetzt grün und der Text auf den Dropdowns ist rot.

Blundell
quelle
Für AppCompat Thema entfernen Sie android:wie folgt<item name="spinnerDropDownItemStyle">@style/mySpinnerItemStyle</item>
Roman_D
28

Ich habe dies mit einer anderen einfachen Technik gemacht,

Kopieren Sie die Dateien simple_spinner_item.xml und simple_spinner_dropdown_item.xml aus dem Android-Ordner res / layout und kopieren Sie sie in Ihr Projekt.

Ändern Sie dann die folgenden Zeilen

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.planets_array, Android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
spinnerSubject.setAdapter(adapter);

wie:

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.planets_array, R.layout.simple_spinner_item);
adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
spinnerSubject.setAdapter(adapter);

Der Rest ist einfach. Sie können jetzt die Datei simple_spinner_item.xml bearbeiten, um das Erscheinungsbild eines sichtbaren Elements im Spinner-Widget zu bearbeiten, und die Datei simple_spinner_dropdown_item.xml bearbeiten, um das Erscheinungsbild der Dropdown-Liste zu ändern.

Zum Beispiel enthält mein Aktivitätslayout:

<Spinner
android:id="@+id/mo_spinnerSubject"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:background="@drawable/spinnerset_background" />

und meine simple_spinner_item.xml enthält jetzt:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:textColor="@color/custom_white"
android:textSize="16sp" />

und die simple_spinner_dropdown_item.xml sieht aus wie:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="?android:attr/spinnerDropDownItemStyle"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:background="@color/custom_black"
android:ellipsize="marquee"
android:singleLine="true"
android:textColor="@color/custom_white" />
saad
quelle
3
Schönes Beispiel. Ich konnte die anderen nicht dazu bringen, in meinem Projekt zu arbeiten, aber das war einfach und wirkte wie ein Zauber.
raider33
2
Dies ist auch eine Lösung, die den neuen Stil nicht global erzwingt, wie es die anderen tun.
Gerhard Burger
26

Sie können setOnItemSelectedListener für das Spinner-Objekt verwenden.

spinnerObject.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
        ((TextView)parentView.getChildAt(0)).setTextColor(Color.rgb(249, 249, 249));
        // OR ((TextView)parentView.getChildAt(0)).setTextColor(Color.RED);
    }
});
Rukmal Dias
quelle
1
Dies ist die einfachste Methode hier :)
Vasil Valchev
1
Ich muss zuerst überprüfen, ob Eltern Kinder haben, andernfalls wird eine NullPointerException ausgelöst, wenn ich die Ausrichtung des Geräts ändere.
David Kibblewhite
Dies kann die beste Lösung sein, wenn die Farbe nur für diesen einen Spinner und nicht global eingestellt ist
bkurzius
Idealerweise ist dies der beste Weg, wenn jemand seinen Spinner-Adapter wiederverwenden möchte. Danke hat so funktioniert!
Sud007
NPE 'void android.widget.TextView.setTextColor (int)'
vlasentiy
12

Es ist eigentlich sehr einfach. Ich habe überall gesucht, du musst nur Stil kreieren und auf Spinner setzen

Erstellen Sie zuerst Ihr Thema in Style.xml

 <style name="spinnerTheme" parent="android:Theme">
    <item name="android:textColor">@color/gray_dark</item>
</style>

Fügen Sie dann in Ihrer XML-Datei, in der Sie Ihren Spinner eingestellt haben, Folgendes hinzu:

android: theme = "@ style / spinnerTheme "

                       <Spinner
                        android:id="@+id/spinner"
                        android:layout_width="match_parent"
                        android:layout_height="50dp"
                        android:padding="10dp"
                        android:paddingBottom="5dp"
                        android:paddingLeft="10dp"
                        android:layout_span="3"
                        android:layout_weight="1.3"
                        android:theme="@style/spinnerTheme"
                        android:textSize="12sp"
                        android:spinnerMode="dialog"
                        android:clickable="false"/>

Viel Spaß beim Codieren

Pre_hacker
quelle
Ausgezeichnet! Ich habe @android verwendet: color / holo_orange_light
pollaris
Dies ändert auch die Textfarbe für Artikel und Dropdown
ymerdrengene
1

Ich glaube nicht, dass mit dem Text eine Farbe verbunden ist. Es ist höchstwahrscheinlich im Android-Code vordefiniert und muss möglicherweise nur selbst erstellt werden, wenn Sie die Farbe des Spinners ändern möchten.

Dazu gehört, dass Sie die ondraw () -Methode ändern und den Spinner so zeichnen, wie er aussehen soll.

Das einzige, von dem ich denke , dass es dieses Problem möglicherweise lösen könnte , ist die Stileigenschaft des Spinners.

Quelle: http://developer.android.com/reference/android/widget/Spinner.html

Dies könnte helfen:

http://www.designerandroid.com/?p=28

JoxTraex
quelle
1
Nun, der Grund, warum ich denke, dass es irgendwo in einem Stil ist, ist, dass beim Wechsel vom Holo zum Holo.Light-Thema die Textfarbe auf den Spinnern von Weiß zu Schwarz wechselt.
Christopher Perry
Nun, Sie könnten Ihren eigenen Stil definieren und ihn dann auf den Spinner anwenden, oder?
JoxTraex
1
Ich könnte, aber ich habe keine Ahnung, welches Attribut für die Textfarbe überschrieben werden soll, daher meine Frage.
Christopher Perry
1

Sie können die Textfarbe ändern, indem Sie die getView-Methode wie folgt überschreiben:

new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_dropdown_item, list()){
                @Override
                public View getView(int position, View convertView, @NonNull ViewGroup parent) {
                    View view = super.getView(position, convertView, parent);
                    //change the color to which ever you want                    
                    ((CheckedTextView) view).setTextColor(Color.RED);
                    return view;
              }
Madhur
quelle
0

Dies funktionierte für mich. Erstellen Sie Ihre eigene Layoutdatei mit einer benutzerdefinierten Definition für das Spinner-Element.

custom_spinner.xml:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/txt_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textColor="#ffffff" />

Ändern Sie das Spinner-Element mit dem Adapter

Spinner spinner= (Spinner) findViewById(R.id.spinner1);
ArrayAdapter adapter = ArrayAdapter.createFromResource(this,R.array.by_loc_array,R.layout.txt_spinner);
spinner.setAdapter(adapter);
Muhammad Dawood
quelle