Füllen Sie den Spinner direkt in die Layout-XML

245

Ist es möglich, die Optionen eines Spinners direkt in der Layout-XML zu füllen? Diese Seite schlägt vor, dass ich einen ArrayAdapter verwenden sollte? Es scheint unangenehm, es nicht zu können.

Cambraca
quelle

Antworten:

581

Ich bin mir nicht sicher, aber probieren Sie es aus.

Definieren Sie in Ihrer Datei strings.xml:

<string-array name="array_name">
<item>Array Item One</item>
<item>Array Item Two</item>
<item>Array Item Three</item>
</string-array>

In Ihrem Layout:

<Spinner 
        android:id="@+id/spinner"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:drawSelectorOnTop="true"
        android:entries="@array/array_name"
    />

Ich habe gehört, dass dies beim Designer nicht immer funktioniert, aber es lässt sich gut kompilieren.

Blindware
quelle
39
Ich wollte nur hinzufügen, dass Sie angeben können, ob Sie separate Werte für das ausgewählte Element wünschen android:entryValues="@array/array_name_values".
Г И І І
3
Ein kurzer Hinweis ... nach meinem Verständnis unterstützen Spinner nicht, drawSelectorOnTopda es keinen anderen Selektor als den Spinner selbst gibt. Die Lösung funktioniert aber definitiv, danke!
Jabari
11
@ ΕГИІИО Spinner wird NICHT unterstützt android:entryValues. ListPreference unterstützt dies.
TalkLittle
1
@TalkLittle war dies eine kürzliche Abwertung? Zu der Zeit, als dies geschrieben wurde, hat es funktioniert.
Blindstuff
1
@blindstuff Es ist leicht zu überprüfen. Schauen Sie sich den Quellcode von Spinnerund an AbsSpinner. Sowohl auf API 19 als auch auf API 23 verwendet der AbsSpinner-Konstruktor, R.styleable.AbsSpinner_entriesjedoch nirgendwo entryValues. Es ist nur ein Zufall, dass Ihr Code das tat, was Sie erwartet hatten. (Oder vielleicht haben die ROMs einiger Hersteller eine benutzerdefinierte Spinner-Implementierung, die tatsächlich android:entryValues
funktioniert
26

Definieren Sie dies in Ihrer String.xml-Datei und benennen Sie das gewünschte Array, z. B. "Weight".

<string-array name="Weight">
<item>Kg</item>
<item>Gram</item>
<item>Tons</item>
</string-array>

und dieser Code in Ihrer layout.xml

<Spinner 
        android:id="@+id/fromspin"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:entries="@array/Weight"
 />

Wird in Ihrer Java-Datei getActivityals Fragment verwendet. Wenn Sie diesen Code in Aktivität schreiben, entfernen Sie ihn getActivity.

a = (Spinner) findViewById(R.id.fromspin);

 ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this.getActivity(),
                R.array.weight, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        a.setAdapter(adapter);
        a.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
                if (a.getSelectedItem().toString().trim().equals("Kilogram")) {
                    if (!b.getText().toString().isEmpty()) {
                        float value1 = Float.parseFloat(b.getText().toString());
                        float kg = value1;
                        c.setText(Float.toString(kg));
                        float gram = value1 * 1000;
                        d.setText(Float.toString(gram));
                        float carat = value1 * 5000;
                        e.setText(Float.toString(carat));
                        float ton = value1 / 908;
                        f.setText(Float.toString(ton));
                    }

                }



            public void onNothingSelected(AdapterView<?> parent) {
                // Another interface callback
            }
        });
        // Inflate the layout for this fragment
        return v;
    }
Tech Zone
quelle
-2

Zum ersten Kommentar: Wenn Sie dies tun, erhalten Sie eine Fehlermeldung (in Android Studio). Dies bezieht sich darauf, dass es außerhalb des Android-Namespace liegt. Wenn Sie nicht wissen, wie Sie diesen Fehler beheben können, sehen Sie sich das folgende Beispiel an. Hoffe das hilft!

Beispiel - Vorher:

<string-array name="roomSize">
    <item>Small(0-4)</item>
    <item>Medium(4-8)</item>
    <item>Large(9+)</item>
</string-array>

Beispiel - Nachher:

<string-array android:name="roomSize">
    <item>Small(0-4)</item>
    <item>Medium(4-8)</item>
    <item>Large(9+)</item>
</string-array>
CPUSCIMAJOR
quelle
1
Funktioniert nicht Die XML-Datei möchte string-array, dass er ein nameAttribut hat, und erkennt das nicht android:name.
Dan Chaltiel