Popolamento del filatore direttamente nel layout xml


246

È possibile popolare le opzioni di uno Spinner direttamente nel layout xml? Questa pagina suggerisce che dovrei usare un ArrayAdapter? Sembra imbarazzante non poterlo fare ..

Risposte:


582

Non ne sono sicuro, ma provaci.

Nel tuo strings.xml definisci:

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

Nel tuo layout:

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

Ho sentito che questo non funziona sempre con il designer, ma si compila bene.


39
Volevo solo aggiungere che se si desidera valori separati per l'elemento selezionato, è possibile specificare android:entryValues="@array/array_name_values".
Ε Г И І И О

3
Una breve nota ... da quanto ho capito, gli Spinner non supportano drawSelectorOnToppoiché non esiste un selettore separato diverso dallo Spinner stesso. La soluzione sicuramente funziona, grazie!
Jabari,

11
@ ΕГИІИО Spinner NON supporta android:entryValues. ListPreference non lo supporta.
TalkLittle

1
@TalkLittle è stata una recente deprecazione? Al momento in cui è stato scritto, ha funzionato.
cieco

1
@blindstuff È facile da verificare. Guarda il codice sorgente di Spinnere AbsSpinner. Sia su API 19 che su 23, il costruttore AbsSpinner fa uso, R.styleable.AbsSpinner_entriesma da nessuna parte lo usano entryValues. È solo una coincidenza che il tuo codice stia facendo quello che ti aspettavi. (O forse le ROM di alcuni produttori hanno un'implementazione Spinner personalizzata che gestisce effettivamente android:entryValues?)
TalkLittle

26

Definiscilo nel tuo file String.xml e dai un nome all'array come desideri, ad esempio "Peso"

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

e questo codice nel tuo layout.xml

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

Nel tuo file java, getActivityviene utilizzato nel frammento; se si scrive quel codice nell'attività, quindi rimuoverlo 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;
    }

-2

Per quanto riguarda il primo commento: se lo fai otterrai un errore (in Android Studio). Questo per quanto riguarda il fatto che è fuori dallo spazio dei nomi Android. Se non sai come correggere questo errore, controlla l'esempio di seguito. Spero che questo ti aiuti!

Esempio -Prima:

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

Esempio - Dopo:

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

1
Non funziona Il file XML vuole string-arrayche abbia un nameattributo e non riconosce android:namequello.
Dan Chaltiel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.