Заполнение блесны прямо в макете XML


246

Можно ли заполнить параметры Spinner прямо в макете XML? Эта страница предлагает мне использовать ArrayAdapter? Кажется неловким, не в состоянии сделать это ..

Ответы:


582

Я не уверен в этом, но попробуй.

В вашем strings.xml определите:

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

В вашем макете:

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

Я слышал, что это не всегда работает на дизайнера, но компилируется нормально.


39
Просто хотел добавить, что если вы хотите отдельные значения для выбранного элемента, вы можете указать android:entryValues="@array/array_name_values".
Ε Г И І И О

3
Одно быстрое замечание ... насколько я понимаю, drawSelectorOnTopSpinner не поддерживает, так как нет другого отдельного селектора, кроме самого Spinner. Решение определенно работает, хотя, спасибо!
Джабари

11
@ ΕГИІИО Spinner НЕ поддерживает android:entryValues. ListPreference поддерживает это.
TalkLittle

1
@TalkLittle это было недавнее осуждение? В то время, когда это было написано, это работало.
слепые вещи

1
@blindstuff Это легко проверить. Посмотрите на исходный код Spinnerи AbsSpinner. И в API 19, и в 23 конструктор AbsSpinner использует, R.styleable.AbsSpinner_entriesно нигде не использует entryValues. Это просто совпадение, что ваш код делал то, что вы ожидали. (Или, может быть, ROM некоторых производителей имеют собственную реализацию Spinner, которая фактически обрабатывает android:entryValues?)
TalkLittle

26

Определите это в файле String.xml и назовите массив, который вы хотите, например, «Вес»

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

и этот код в вашем layout.xml

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

В вашем Java-файле getActivityиспользуется фрагмент; если вы пишете этот код в действии, то удалите 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

Относительно первого комментария: если вы сделаете это, вы получите ошибку (в Android Studio). Это связано с тем, что он находится вне пространства имен Android. Если вы не знаете, как исправить эту ошибку, посмотрите пример ниже. Надеюсь это поможет!

Пример -Перед:

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

Пример - после:

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

1
Не работает Файл XML хочет, string-arrayчтобы он имел nameатрибут, и не распознает его android:name.
Дэн Чалтиэль
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.