Wypełnianie pokrętła bezpośrednio w układzie xml

246

Czy możliwe jest wypełnienie opcji Spinnera bezpośrednio w układzie xml? Ta strona sugeruje, że powinienem użyć ArrayAdapter? Wydaje się dziwne, że nie mogę tego zrobić ...

Cambraca
źródło

Odpowiedzi:

582

Nie jestem tego pewien, ale spróbuj.

W pliku strings.xml zdefiniuj:

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

W twoim układzie:

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

Słyszałem, że nie zawsze działa to na projektanta, ale dobrze się kompiluje.

ślepy
źródło
39
Chciałem tylko dodać, że jeśli chcesz osobne wartości dla wybranego elementu, możesz określić android:entryValues="@array/array_name_values".
Г Г И І И О
3
Jedna szybka uwaga ... z mojego zrozumienia, Błystki nie obsługują, drawSelectorOnTopponieważ nie ma osobnego selektora oprócz samego Błystka. Rozwiązanie zdecydowanie działa, dzięki!
Jabari
11
@ SpinГИІИО Spinner NIE obsługuje android:entryValues. ListPreference obsługuje to.
TalkLittle
1
@TalkLittle czy to była ostatnia rezygnacja? W chwili pisania tego tekstu działało.
blindstuff
1
@blindstuff Łatwo to zweryfikować. Spójrz na kod źródłowy Spinneri AbsSpinner. Zarówno w API 19, jak i 23 konstruktor AbsSpinner korzysta, R.styleable.AbsSpinner_entriesale nigdzie go nie używa entryValues. To tylko zbieg okoliczności, że Twój kod działał zgodnie z oczekiwaniami. (A może ROM niektórych producentów ma niestandardową implementację Spinnera, która faktycznie obsługuje android:entryValues?)
TalkLittle,
26

Zdefiniuj to w pliku String.xml i nazwij tablicę, co chcesz, na przykład „Waga”

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

i ten kod w pliku layout.xml

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

W twoim pliku Java getActivityjest używany we fragmentach; jeśli napiszesz ten kod w działaniu, usuń 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;
    }
Strefa technologiczna
źródło
-2

W odniesieniu do pierwszego komentarza: jeśli to zrobisz, pojawi się błąd (w Android Studio). Chodzi o to, że jest poza obszarem nazw Androida. Jeśli nie wiesz, jak naprawić ten błąd, sprawdź poniższy przykład. Mam nadzieję że to pomoże!

Przykład -Przed:

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

Przykład - po:

<string-array android:name="roomSize">
    <item>Small(0-4)</item>
    <item>Medium(4-8)</item>
    <item>Large(9+)</item>
</string-array>
CPUSCIMAJOR
źródło
1
Nie działa Plik XML chce, string-arrayaby miał nameatrybut i nie rozpoznaje tego android:name.
Dan Chaltiel