Android Spinner 小部件
最后修改于 2012 年 10 月 29 日
在本章 Android 开发教程中,我们将介绍 Spinner 小部件。
Spinner 小部件允许用户从一系列选项中选择一个项目。在正常状态下,它显示当前选定的项目。点击 Spinner 小部件会显示一个下拉菜单,其中包含所有可用的项目。用户可以从列表中选择一个新的项目。Spinner 类用于创建 Spinner 小部件。
Spinner 小部件可以在 XML 文件中填充。或者可以以编程方式填充。在后一种情况下,我们需要一个 Adapter 类来填充 Spinner 小部件。Adapter 是 Spinner 和其数据之间的桥梁。
Spinner I
在第一个示例中,我们有一个 Spinner 小部件,其项目在 XML 文件中定义。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zetcode.finish"
android:versionCode="1"
android:versionName="1.0">
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
<activity android:name="MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
这是程序的清单文件。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Spinner
android:id="@+id/spn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/dlangs"
android:layout_marginTop="10dip"
android:prompt="@string/spn_title" />
<TextView
android:id="@+id/tvId"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dip"
/>
</LinearLayout>
在 main.xml 布局文件中,我们有一个 Spinner 和一个 TextView。android:entries="@array/dlangs" 属性定义了一个提供字符串数组的 XML 资源。字符串写在 strings.xml 文件中。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Spinner</string>
<string name="spn_title">Choose a language</string>
<string-array name="dlangs">
<item>Python</item>
<item>PHP</item>
<item>Perl</item>
<item>Tcl</item>
<item>Ruby</item>
</string-array>
</resources>
在 strings.xml 文件中,我们有字符串数组的元素。这些在点击 Spinner 小部件时显示。
package com.zetcode.spinner;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Spinner;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
public class MainActivity extends Activity implements OnItemSelectedListener
{
private TextView tv;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv = (TextView) findViewById(R.id.tvId);
Spinner spn = (Spinner) findViewById(R.id.spn);
spn.setOnItemSelectedListener(this);
}
@Override
public void onItemSelected(AdapterView<?> parent, View v, int pos, long id)
{
String item = parent.getItemAtPosition(pos).toString();
tv.setText(item);
}
@Override
public void onNothingSelected(AdapterView<?> arg0)
{
tv.setText("");
}
}
从 Spinner 小部件中选择的项目显示在 TextView 小部件中。
public class MainActivity extends Activity implements OnItemSelectedListener
MainActivity 类实现了 OnItemSelectedListener。该类现在必须实现两个方法:onItemSelected() 和 onNothingSelected() 方法。
Spinner spn = (Spinner) findViewById(R.id.spn); spn.setOnItemSelectedListener(this);
这两行获取对 Spinner 小部件的引用,并为其设置 OnItemSelectedListener。
@Override
public void onItemSelected(AdapterView<?> parent, View v, int pos, long id)
{
String item = parent.getItemAtPosition(pos).toString();
tv.setText(item);
}
在 onItemSelected() 方法中,我们使用 getItemAtPosition() 获取当前选中的 Spinner 项目。该项目被转换为字符串并设置为 TextView。
Spinner II
在第二个 Spinner 示例中,我们将以编程方式定义 Spinner 元素列表。为此,我们将使用 ArrayAdapter 结合 ArrayList。
Adapter 设计模式被 Android 平台用于处理 Spinner 小部件。ArrayAdapter 是数据源和数据视图之间的中介。在这种情况下,数据源是 ArrayList,视图是 Spinner 小部件。使用 Adapter,我们可以解耦我们的代码。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zetcode.toast"
android:versionCode="1"
android:versionName="1.0">
<application android:label="@string/app_name"
android:icon="@drawable/ic_launcher">
<activity android:name="MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
这是清单文件。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Spinner
android:id="@+id/spnId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dip"
android:prompt="@string/spn_title" />
<TextView
android:id="@+id/tvId"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dip" />
</LinearLayout>
在 main.xml 文件中,我们有两个小部件:Spinner 和 TextView 小部件。这次我们没有为 Spinner 定义数组数据条目。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Spinner2</string>
<string name="spn_title">Choose a language</string>
</resources>
这是 strings.xml 资源文件。
package com.zetcode.spinner2;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Spinner;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
public class MainActivity extends Activity implements OnItemSelectedListener
{
private TextView tv;
private Spinner spn;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setup();
}
public void setup()
{
tv = (TextView) findViewById(R.id.tvId);
spn = (Spinner) findViewById(R.id.spnId);
fillSpinner(spn);
spn.setOnItemSelectedListener(this);
}
public void fillSpinner(Spinner spn)
{
List<String> lst = new ArrayList<String>();
lst.add("Python");
lst.add("PHP");
lst.add("Perl");
lst.add("Tcl");
lst.add("Ruby");
ArrayAdapter<String> da = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, lst);
da.setDropDownViewResource(android.R.layout.simple_spinner_item);
spn.setAdapter(da);
}
@Override
public void onItemSelected(AdapterView<?> parent, View v, int pos, long id)
{
String item = parent.getItemAtPosition(pos).toString();
tv.setText(item);
}
@Override
public void onNothingSelected(AdapterView<?> arg0)
{
tv.setText("");
}
}
在 MainActivity.java 源文件中,我们用数据填充 Spinner 小部件并为该小部件实现 OnItemSelectedListener。
spn = (Spinner) findViewById(R.id.spnId); fillSpinner(spn);
我们获取对 Spinner 小部件的引用,并调用 fillSpinner() 方法来用数据填充它。
List<String> lst = new ArrayList<String>();
lst.add("Python");
lst.add("PHP");
lst.add("Perl");
lst.add("Tcl");
lst.add("Ruby");
创建一个 ArrayList 并用字符串填充。
ArrayAdapter<String> da = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, lst);
创建 ArrayAdapter 的实例。它将 ArrayList 作为参数。
da.setDropDownViewResource(android.R.layout.simple_spinner_item);
此行确定 Spinner 小部件的下拉菜单的外观。这是一个没有单选按钮的下拉菜单。具有 android.R.layout.simple_spinner_dropdown_item 定义的 Spinner,其行中带有单选按钮。
spn.setAdapter(da);
Adapter 已为 Spinner 小部件设置。
在本章 Android 开发教程中,我们写了关于 Spinner 小部件的内容。