ZetCode

Android 选择器

最后修改于 2012年11月21日

在本章的 Android 开发教程中,我们将讨论 Android 选择器。选择器是允许我们从一组值中选择单个值的控件。

有数字、日期或时间选择器。

NumberPicker

NumberPicker 是一个允许我们从预定义值范围中选择数字的控件。在这个例子中,清单文件未被修改。

main.xml
<?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 的选定值。

strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">NumberPicker</string>
</resources>

字符串资源文件。

MainActivity.java
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 设置了最大值和最小值。

NumberPicker widget
图:NumberPicker 控件

TimePicker

TimePicker 是一个用于选择一天中时间的控件。它有两种模式:24小时制或上午/下午制。可以通过垂直的微调器来控制小时和分钟数字的选择。DatePicker 是一个用于选择日期的控件。它与 TimePicker 非常相似。

清单文件未被修改。

main.xml
<?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 中。

strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">TimePicker</string>
</resources>

这是 strings.xml 资源文件。

MainActivity.java
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);         
}

当活动首次显示时,我们显示当前时间。

TimePicker
图:TimePicker 控件

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