Android 选择器
最后修改于 2012年11月21日
在本章的 Android 开发教程中,我们将讨论 Android 选择器。选择器是允许我们从一组值中选择单个值的控件。
有数字、日期或时间选择器。
NumberPicker
NumberPicker
是一个允许我们从预定义值范围中选择数字的控件。在这个例子中,清单文件未被修改。
<?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" > <NumberPicker android:id="@+id/npId" android:layout_marginTop="5dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tvId" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:layout_marginLeft="5dp" android:text="0" android:textSize="30sp" /> </LinearLayout>
在布局文件中,我们有一个 NumberPicker
控件和一个 TextView
控件。TextView
控件将显示 NumberPicker
的选定值。
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">NumberPicker</string> </resources>
字符串资源文件。
package com.zetcode.numpick; import android.app.Activity; import android.os.Bundle; import android.widget.NumberPicker; import android.widget.TextView; import android.widget.NumberPicker.OnValueChangeListener; public class MainActivity extends Activity { private TextView tv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setupUI(); } public void setupUI() { tv = (TextView) findViewById(R.id.tvId); NumberPicker np = (NumberPicker) findViewById(R.id.npId); np.setOnValueChangedListener(new OnValueChangeListener() { public void onValueChange(NumberPicker picker, int oldVal, int newVal) { tv.setText(String.valueOf(newVal)); } }); np.setMaxValue(100); np.setMinValue(0); } }
通过点击 NumberPicker
的加号和减号,我们可以选择一个新值。当前选定的值将显示在 TextView
控件中。
NumberPicker np = (NumberPicker) findViewById(R.id.npId);
从 main.xml 文件中检索 NumberPicker
控件的引用。
np.setOnValueChangedListener(new OnValueChangeListener() { public void onValueChange(NumberPicker picker, int oldVal, int newVal) { tv.setText(String.valueOf(newVal)); } });
向 NumberPicker
控件添加了一个 OnValueChangeListener
。当 NumberPicker
的值改变时,它会调用 onValueChange()
方法。在此方法中,我们将当前选定的值设置为 TextView
控件。
np.setMaxValue(100); np.setMinValue(0);
我们为 NumberPicker
设置了最大值和最小值。

TimePicker
TimePicker
是一个用于选择一天中时间的控件。它有两种模式:24小时制或上午/下午制。可以通过垂直的微调器来控制小时和分钟数字的选择。DatePicker
是一个用于选择日期的控件。它与 TimePicker
非常相似。
清单文件未被修改。
<?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" > <TimePicker android:id="@+id/tpId" android:layout_marginTop="5dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tvId" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:layout_marginLeft="5dp" android:textSize="30sp" /> </LinearLayout>
在 main.xml
文件中,我们有 TimePicker 和 TextView 控件。选定的时间显示在 TextView 中。
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">TimePicker</string> </resources>
这是 strings.xml
资源文件。
package com.zetcode.timepicker; import android.app.Activity; import android.os.Bundle; import android.widget.TimePicker; import android.widget.TextView; import android.widget.TimePicker.OnTimeChangedListener; public class MainActivity extends Activity { private TextView tv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setupUI(); } public void setupUI() { tv = (TextView) findViewById(R.id.tvId); TimePicker tp = (TimePicker) findViewById(R.id.tpId); displayCurrentTime(tp); tp.setOnTimeChangedListener(new OnTimeChangedListener() { public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { StringBuilder tm = new StringBuilder(); tm.append(hourOfDay); tm.append(" h "); tm.append(minute); tm.append(" m"); tv.setText(tm); } }); } public void displayCurrentTime(TimePicker tp) { int h = tp.getCurrentHour(); int m = tp.getCurrentMinute(); StringBuilder tm = new StringBuilder(); tm.append(h); tm.append(" h "); tm.append(m); tm.append(" m"); tv.setText(tm); } }
TimePicker
监听 OnTimeChangedListener
。当时间改变时,新的时间值在 onTimeChanged()
方法中被设置为 TextView。
tp.setOnTimeChangedListener(new OnTimeChangedListener() { public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { StringBuilder tm = new StringBuilder(); tm.append(hourOfDay); tm.append(" h "); tm.append(minute); tm.append(" m"); tv.setText(tm); } });
在一个匿名的 OnTimeChangedListener
类中,我们实现了 onTimeChanged()
方法。我们使用 StringBuilder
来构建要显示的字符串,并将其设置为 TextView
控件。
public void displayCurrentTime(TimePicker tp) { int h = tp.getCurrentHour(); int m = tp.getCurrentMinute(); StringBuilder tm = new StringBuilder(); tm.append(h); tm.append(" h "); tm.append(m); tm.append(" m"); tv.setText(tm); }
当活动首次显示时,我们显示当前时间。

在本章的 Android 开发教程中,我们讨论了选择器。