Xamarin.Android 微调框
Spinner
是一个小组件,提供用于选择项的下拉列表。 本指南介绍如何创建一个简单的应用,在微调框中显示选项列表,然后显示与所选选项相关的其他值的修改。
基本微调框
在本教程的第一部分,你将创建一个简单的微调框小组件,用于显示行星列表。 选择行星后,一条吐司提示消息将显示所选项:
启动名为 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>
请注意,TextView
的 android:text
属性和 Spinner
的 android: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>
元素定义上述布局中的 TextView
和 Spinner
引用的标题字符串。
<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-array
,Android.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
。
运行应用程序;应如下所示:
使用键/值对的微调框
通常,必须使用 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();
}
运行应用程序;吐司提示应如下所示:
资源
本页的部分内容是根据 Android 开源项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 Attribution License 中的条款进行使用。