在你的应用中添加下拉菜单

下拉菜单提供了一种快速从一组值中选择一个值的方法。在默认状态下,下拉菜单显示其当前选定的值。点击下拉菜单会显示一个菜单,其中显示用户可以选择的所有其他值。

图 1. 下拉菜单,显示可用值。

你可以使用 Spinner 对象将下拉菜单添加到你的布局中,通常在你的 XML 布局中使用 <Spinner> 元素。以下示例显示了这一点

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

要使用一列选项填充下拉菜单,请在你的 ActivityFragment 源代码中指定一个 SpinnerAdapter

如果你使用的是 Material Design 组件,展开式下拉菜单 等效于 Spinner

使用用户选项填充下拉菜单

你为下拉菜单提供的选项可以来自任何来源,但你必须通过 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.planets_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.planets_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 is 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 is 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.planets_spinner)
spinner.onItemSelectedListener = this

Java

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

如果使用你的 ActivityFragment 实现 AdapterView.OnItemSelectedListener 接口,如前面的示例所示,你可以将 this 作为接口实例传递。