Xamarin.Android 微调框

Spinner 是一个小组件,提供用于选择项的下拉列表。 本指南介绍如何创建一个简单的应用,在微调框中显示选项列表,然后显示与所选选项相关的其他值的修改。

基本微调框

在本教程的第一部分,你将创建一个简单的微调框小组件,用于显示行星列表。 选择行星后,一条吐司提示消息将显示所选项:

Example screenshots of HelloSpinner app

启动名为 HelloSpinner 的新项目。

打开 Resources/Layout/Main.axml 并插入以下 XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:padding="10dip"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dip"
        android:text="@string/planet_prompt"
    />
    <Spinner
        android:id="@+id/spinner"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:prompt="@string/planet_prompt"
    />
</LinearLayout>

请注意,TextViewandroid:text 属性和 Spinnerandroid:prompt 属性都引用了相同的字符串资源。 此文本充当小组件的标题。 当应用于 Spinner 时,标题文本将显示在选择小部件时出现的选择对话框中。

编辑 Resources/Values/Strings.xml 并修改文件,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="app_name">HelloSpinner</string>
  <string name="planet_prompt">Choose a planet</string>
  <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>

第二个 <string> 元素定义上述布局中的 TextViewSpinner 引用的标题字符串。 <string-array> 元素定义将显示为 Spinner 小组件中的列表的字符串列表。

现在打开 MainActivity.cs 并添加以下 using 语句:

using System;

接下来,为 OnCreate() 方法插入以下代码:

protected override void OnCreate (Bundle bundle)
{
    base.OnCreate (bundle);

    // Set our view from the "Main" layout resource
    SetContentView (Resource.Layout.Main);

    Spinner spinner = FindViewById<Spinner> (Resource.Id.spinner);

    spinner.ItemSelected += new EventHandler<AdapterView.ItemSelectedEventArgs> (spinner_ItemSelected);
    var adapter = ArrayAdapter.CreateFromResource (
            this, Resource.Array.planets_array, Android.Resource.Layout.SimpleSpinnerItem);

    adapter.SetDropDownViewResource (Android.Resource.Layout.SimpleSpinnerDropDownItem);
    spinner.Adapter = adapter;
}

Main.axml 布局设置为内容视图后,使用 FindViewById<>(int) 从布局中获取 Spinner 小组件。 此 然后,CreateFromResource() 方法创建一个新的 ArrayAdapter,它将字符串数组中的每个项绑定到 Spinner 的初始外观(这是选择时每个项在微调框中的显示方式)。 Resource.Array.planets_array ID 引用上面定义的 string-arrayAndroid.Resource.Layout.SimpleSpinnerItem ID 引用由平台定义的标准微调框外观的布局。 调用 SetDropDownViewResource 以定义打开小组件时每个项的外观。 最后,ArrayAdapter 设置为通过设置 Adapter 属性将其所有项与 Spinner 关联。

现在提供一个回叫方法,用于在从 Spinner 中选择某个项时通知应用程序。 此方法应如下所示:

private void spinner_ItemSelected (object sender, AdapterView.ItemSelectedEventArgs e)
{
    Spinner spinner = (Spinner)sender;
    string toast = string.Format ("The planet is {0}", spinner.GetItemAtPosition (e.Position));
    Toast.MakeText (this, toast, ToastLength.Long).Show ();
}

选择某个项后,发送方将被强制转换为 Spinner,以便可以访问该项。 使用 ItemEventArgs 上的属性 Position,可以找到所选对象的文本,并使用它来显示 Toast

运行应用程序;应如下所示:

Screenshot example of Spinner with Mars selected as the planet

使用键/值对的微调框

通常,必须使用 Spinner 显示与应用使用的某种数据关联的键值。 由于 Spinner 不能直接使用键/值对,因此必须单独存储键/值对,使用键值填充 Spinner,然后使用微调框中所选键的位置查找关联的数据值。

在以下步骤中,HelloSpinner 应用被修改为显示所选行星的平均温度

将以下 using 语句添加到 MainActivity.cs

using System.Collections.Generic;

将以下实例变量添加到 MainActivity 类。 此列表将保存行星及其平均温度的键/值对:

private List<KeyValuePair<string, string>> planets;

OnCreate 方法中,在声明 adapter 之前添加以下代码:

planets = new List<KeyValuePair<string, string>>
{
    new KeyValuePair<string, string>("Mercury", "167 degrees C"),
    new KeyValuePair<string, string>("Venus", "464 degrees C"),
    new KeyValuePair<string, string>("Earth", "15 degrees C"),
    new KeyValuePair<string, string>("Mars", "-65 degrees C"),
    new KeyValuePair<string, string>("Jupiter" , "-110 degrees C"),
    new KeyValuePair<string, string>("Saturn", "-140 degrees C"),
    new KeyValuePair<string, string>("Uranus", "-195 degrees C"),
    new KeyValuePair<string, string>("Neptune", "-200 degrees C")
};

此代码为行星及其关联的平均温度创建一个简单的存储。 (在实际应用中,数据库通常用于存储密钥及其关联数据。)

紧接在上述代码后面,添加以下行以提取密钥并将其放入列表中(按顺序):

List<string> planetNames = new List<string>();
foreach (var item in planets)
    planetNames.Add (item.Key);

将此列表传递给 ArrayAdapter 构造函数(而不是 planets_array 资源):

var adapter = new ArrayAdapter<string>(this,
    Android.Resource.Layout.SimpleSpinnerItem, planetNames);

修改 spinner_ItemSelected,以便使用所选位置查找与所选行星关联的值(温度):

private void spinner_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e)
{
    Spinner spinner = (Spinner)sender;
    string toast = string.Format("The mean temperature for planet {0} is {1}",
        spinner.GetItemAtPosition(e.Position), planets[e.Position].Value);
    Toast.MakeText(this, toast, ToastLength.Long).Show();
}

运行应用程序;吐司提示应如下所示:

Example of planet selection displaying temperature

资源

本页的部分内容是根据 Android 开源项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 Attribution License 中的条款进行使用。