微调框

微调框提供了一种方法,可让用户从值集内快速选择一个值。默认状态下,微调框显示其当前所选的值。轻触微调框可显示下拉菜单,其中列有所有其他可用值,用户可从中选择一个新值。

您可以使用 Spinner 对象向布局中添加一个微调框。通常应在 XML 布局中使用 <Spinner> 元素来执行此操作。例如:

<Spinner
    android:id="@+id/planets_spinner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

如需使用选择列表填充微调框,您还需在 ActivityFragment 源代码中指定 SpinnerAdapter

关键类如下:

使用用户选项填充微调框

微调框选项不限来源,但您必须通过 SpinnerAdapter 提供这些选项,例如:若通过数组获取选项,提供方式应为 ArrayAdapter;若通过数据库查询获取选项,提供方式应为 CursorAdapter

例如,如果预先确定了微调框的可用选项,您可通过字符串资源文件中定义的字符串数组来提供这些选项:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="planets_array">
        <item>Mercury</item>
        <item>Venus</item>
        <item>Earth</item>
        <item>Mars</item>
        <item>Jupiter</item>
        <item>Saturn</item>
        <item>Uranus</item>
        <item>Neptune</item>
    </string-array>
</resources>

对于如上所示的数组,您可以在 ActivityFragment 中使用以下代码,从而使用 ArrayAdapter 实例为微调框提供该数组:

Kotlin

val spinner: Spinner = findViewById(R.id.spinner)
// Create an ArrayAdapter using the string array and a default spinner layout
ArrayAdapter.createFromResource(
        this,
        R.array.planets_array,
        android.R.layout.simple_spinner_item
).also { adapter ->
    // Specify the layout to use when the list of choices appears
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
    // Apply the adapter to the spinner
    spinner.adapter = adapter
}

Java

Spinner spinner = (Spinner) findViewById(R.id.spinner);
// Create an ArrayAdapter using the string array and a default spinner layout
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
        R.array.planets_array, android.R.layout.simple_spinner_item);
// Specify the layout to use when the list of choices appears
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Apply the adapter to the spinner
spinner.setAdapter(adapter);

借助 createFromResource() 方法,您可以从字符串数组创建 ArrayAdapter。此方法的第三个参数是布局资源,其定义了所选选项在微调框控件中的显示方式。simple_spinner_item 布局是平台提供的默认布局,除非您想为微调框外观定义自己的布局,否则应使用此布局。

然后,您应调用 setDropDownViewResource(int),从而指定适配器用于显示微调框选择列表的布局(simple_spinner_dropdown_item 是平台定义的另一种标准布局)。

接着,通过调用 setAdapter() 将适配器应用到 Spinner

响应用户选择

当用户从下拉菜单中选择某个项目时,Spinner 对象会收到一个 on-item-selected 事件。

如需定义微调框的选择事件处理程序,请实现 AdapterView.OnItemSelectedListener 接口以及相应的 onItemSelected() 回调方法。例如,以下是 Activity 中的一个接口实现:

Kotlin

class SpinnerActivity : Activity(), AdapterView.OnItemSelectedListener {

    override fun onItemSelected(parent: AdapterView<*>, view: View?, pos: Int, id: Long) {
        // An item was selected. You can retrieve the selected item using
        // parent.getItemAtPosition(pos)
    }

    override fun onNothingSelected(parent: AdapterView<*>) {
        // Another interface callback
    }
}

Java

public class SpinnerActivity extends Activity implements OnItemSelectedListener {
    ...

    public void onItemSelected(AdapterView<?> parent, View view,
            int pos, long id) {
        // An item was selected. You can retrieve the selected item using
        // parent.getItemAtPosition(pos)
    }

    public void onNothingSelected(AdapterView<?> parent) {
        // Another interface callback
    }
}

AdapterView.OnItemSelectedListener 需要使用 onItemSelected()onNothingSelected() 回调方法。

然后,您需通过调用 setOnItemSelectedListener() 来指定接口实现:

Kotlin

val spinner: Spinner = findViewById(R.id.spinner)
spinner.onItemSelectedListener = this

Java

Spinner spinner = (Spinner) findViewById(R.id.spinner);
spinner.setOnItemSelectedListener(this);

如果您通过 ActivityFragment 来实现 AdapterView.OnItemSelectedListener 接口(如上例所示),则能够以接口实例的形式传递 this