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 ..

Cambraca
fonte

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.

blindstuff
fonte
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;
    }
Tech Zone
fonte
-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>
CPUSCIMAJOR
fonte
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