Remplissage du spinner directement dans la mise en page xml


246

Est-il possible de remplir les options d'un Spinner directement dans la mise en page xml? Cette page suggère que je devrais utiliser un ArrayAdapter? Il semble maladroit de ne pas pouvoir le faire ..

Réponses:


582

Je ne suis pas sûr de cela, mais essayez-le.

Dans votre strings.xml, définissez:

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

Dans votre mise en page:

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

J'ai entendu dire que cela ne fonctionne pas toujours sur le concepteur, mais cela se compile bien.


39
Je voulais juste ajouter que si vous voulez des valeurs distinctes pour l'élément sélectionné, vous pouvez le spécifier android:entryValues="@array/array_name_values".
Ε Г И І И О

3
Une petite note ... d'après ce que je comprends, les Spinners ne prennent pas en charge drawSelectorOnTopcar il n'y a pas de sélecteur séparé autre que le Spinner lui-même. La solution fonctionne certainement, merci!
Jabari

11
@ ΕГИІИО Spinner ne prend pas en charge android:entryValues. ListPreference le prend en charge.
TalkLittle

1
@TalkLittle était-ce une dépréciation récente? Au moment où cela a été écrit, cela fonctionnait.
blindstuff

1
@blindstuff C'est facile à vérifier. Regardez le code source de Spinneret AbsSpinner. Sur les API 19 et 23, le constructeur AbsSpinner utilise, R.styleable.AbsSpinner_entriesmais il n'utilise nulle part entryValues. Ce n'est qu'une coïncidence si votre code faisait ce que vous attendiez. (Ou peut-être que les ROM de certains fabricants ont une implémentation Spinner personnalisée qui gère réellement android:entryValues?)
TalkLittle

26

Définissez-le dans votre fichier String.xml et nommez le tableau comme vous le souhaitez, par exemple "Weight"

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

et ce code dans votre layout.xml

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

Dans votre fichier java, getActivityest utilisé en fragment; si vous écrivez ce code dans l'activité, supprimez-le 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

En ce qui concerne le premier commentaire: Si vous faites cela, vous obtiendrez une erreur (dans Android Studio). Cela concerne le fait qu'il soit hors de l'espace de noms Android. Si vous ne savez pas comment corriger cette erreur, consultez l'exemple ci-dessous. J'espère que cela t'aides!

Exemple -avant:

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

Exemple - Après:

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

1
Ça ne marche pas. Le fichier XML veut string-arrayqu'il ait un nameattribut et ne reconnaît pas celui- android:nameci.
Dan Chaltiel
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.