Preenchendo o girador diretamente no xml do layout


246

É possível preencher as opções de um Spinner diretamente no xml de layout? Esta página sugere que eu devo usar um ArrayAdapter? Parece estranho não poder fazer isso ..

Respostas:


582

Não tenho certeza disso, mas tente.

Em seu strings.xml, defina:

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

No seu layout:

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

Ouvi dizer que isso nem sempre funciona no designer, mas compila bem.


39
Só queria acrescentar que, se você quiser valores separados para o item selecionado, poderá especificar android:entryValues="@array/array_name_values".
Ε Г И І И О

3
Uma observação rápida ... do meu entendimento, os Spinners não suportam, drawSelectorOnToppois não há um seletor separado que não seja o próprio Spinner. A solução definitivamente funciona, obrigado!
Jabari

11
O Spinner NÃO suporta android:entryValues. ListPreference suporta.
TalkLittle

1
@TalkLittle Isso foi uma depreciação recente? No momento em que foi escrito, funcionou.
blindstuff

1
@blindstuff É fácil de verificar. Veja o código fonte de Spinnere AbsSpinner. Nas API 19 e 23, o construtor AbsSpinner faz uso, R.styleable.AbsSpinner_entriesmas em nenhum lugar ele usa entryValues. É apenas uma coincidência que seu código esteja fazendo o que você esperava. (Ou talvez ROMs de alguns fabricantes têm uma implementação Spinner personalizado que realmente lida com android:entryValues?)
TalkLittle

26

Defina isso no seu arquivo String.xml e nomeie a matriz como desejar, como "Peso"

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

e esse código no seu layout.xml

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

No seu arquivo java, getActivityé usado em fragmento; se você escrever esse código em atividade, remova-o 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

Em relação ao primeiro comentário: Se você fizer isso, receberá um erro (no Android Studio). Isso se deve ao fato de estar fora do namespace do Android. Se você não sabe como corrigir esse erro, veja o exemplo abaixo. Espero que isto ajude!

Exemplo -Antes:

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

Exemplo - Depois:

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

1
Não funciona O arquivo XML deseja que ele string-arraytenha um nameatributo e não o reconhece android:name.
Dan Chaltiel 29/08
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.