在布局xml中直接填充下拉框

275

在布局 XML 中直接填充 Spinner 的选项,是否可行?这个页面建议我使用 ArrayAdapter。不这样做好像有些尴尬。

3个回答

641

我不确定,但试试看。

在你的 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"
    />

我听说这在设计师上不总是起作用,但它可以成功编译。


42
只是想补充一点,如果您希望每个选定项有单独的值,您可以指定 android:entryValues="@array/array_name_values" - Ε Г И І И О
4
一个快速的注意事项...据我所了解,Spinner不支持drawSelectorOnTop,因为除了Spinner本身之外,没有单独的选择器。不过这个解决方案肯定有效,谢谢! - Jabari
13
@╬Ģąōąśąåąśą× SpinnerõĖŹµö»µīüandroid:entryValues’╝īĶĆīListPreferenceµö»µīüŃĆé - TalkLittle
1
@TalkLittle 这是最近才被弃用的吗?在这段代码编写时它是可以工作的。 - blindstuff
2
@blindstuff 这很容易验证。查看SpinnerAbsSpinner的源代码。在API 19和23上,AbsSpinner构造函数使用了R.styleable.AbsSpinner_entries,但是没有使用entryValues。你的代码之所以能按照你的预期行事只不过是巧合而已。(或者一些制造商的ROM实际上处理了android:entryValues?) - TalkLittle
显示剩余6条评论

39

在您的String.xml文件中定义它,并将数组命名为您想要的名称,例如"Weight"

<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属性。 - Dan Chaltiel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接