概述
安卓提供了现成的对话框,让用户选择一个时间或日期。每一个选择器控制时间(小时,分钟,AM/PM)或日期(月,日,年)的每一部分的选择。使用这些选择器帮助 确保用户正确的,格式化的,和适合的选择一个时间或日期。
我们推荐你使用
DialogFragment
来容纳每一个时间或日期选择器。
DialogFragment
为你管理对话框的生命周期并且允许你在不同的布局结构中显示该选择器,例如 手机中的基本对话框或在大屏幕中作为一部分嵌入。
尽管
DialogFragment是在安卓3.0(API 11)才第一次出现,如果你的应用支持3.0更早的版本——即使是安卓1.6——你可以在
support library使用
DialogFragment 来向后兼容。
注:下面是示例代码展示了为
DialogFragment使用
support library API来如何创建一个时间选择器和日期选择器。如果你的应用
minSdkVersion 是11或之上,你可以直接使用
DialogFragment
.。
创建一个时间选择器
使用
DialogFragment来展示一个时间选择对话框(
TimePickerDialog),你需要定义一个继承自
DialogFragment的fragment 类,并且从该fragment的
onCreateDialog()方法中返回一个
TimePickerDialog。
注:如果你的应用支持的版本为比安卓3.0更老,确保你的安卓工程使用了support library
将 DialogFragment延伸为时间选择器(time picker)
为一个
TimePickerDialog 定义一个
DialogFragment
,你必须:
- 定义
onCreateDialog()
来返回一个TimePickerDialog的引用 - 实现
TimePickerDialog.OnTimeSetListener
接口来响应用户设置时间的事件
这里有个例子:
public static class TimePickerFragment extends DialogFragment
implements TimePickerDialog.OnTimeSetListener {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current time as the default values for the picker
final Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
// Create a new instance of TimePickerDialog and return it
return new TimePickerDialog(getActivity(), this, hour, minute,
DateFormat.is24HourFormat(getActivity()));
}
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
// Do something with the time chosen by the user
}
}
查看
TimePickerDialog 类来了解更多关于该构造函数参数的信息
现在你所需要做的就是将这个fragment的实例添加到你的activity中。
展示时间选择器
一旦你像上面一样定义了一个
DialogFragment,你可以通过创建该
DialogFragment的一个引用并且调用
show()
.来展示该时间选择器。
一个例子,这里有一个按钮,当点击时,调用一个方法来显示该对话框:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pick_time"
android:onClick="showTimePickerDialog" />
当用户点击该按钮,系统调用了如下的方法:
public void showTimePickerDialog(View v) {
DialogFragment newFragment = new TimePickerFragment();
newFragment.show(getSupportFragmentManager(), "timePicker");
}
该方法调在一个新的
DialogFragment引用中调用了
show()。
show()方法需要一个
FragmentManager的引用和该fragment的唯一的标签名。
警告:如果你的应用支持安卓3.0及其以下版本,确保你在调用
getSupportFragmentManager()
时获得了一个
FragmentManager
.的引用。也应该确保你展示该时间选择器的activity继承了
FragmentActivity而不是标准的
Activity
类。
创建日期选择器(Date Picker)
创建日期选择对话框(
DatePickerDialog)和创建时间选择对话框(
TimePickerDialog
.)相似。唯一的不同将在于为对话框创建的fragment。
为使用
DialogFragment来展示一个
DatePickerDialog
,你需要定义一个继承自
DialogFragment
的fragment类并且从fragment中的
onCreateDialog()方法中返回一个
DatePickerDialog
注:如果你的应用支撑安卓3.0及更早的版本,确保你的工程中使用了安卓 support library
将DialogFragment 延伸为日期选择器(date picker)
为
DatePickerDialog定义一个
DialogFragment,你必须:
- 定义一个
onCreateDialog()
方法返回一个DatePickerDialog的引用 - 实现DatePickerDialog.OnDateSetListener接口来接收用户选择日期的事件
下面是个示例:
public static class DatePickerFragment extends DialogFragment
implements DatePickerDialog.OnDateSetListener {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker
final Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
// Create a new instance of DatePickerDialog and return it
return new DatePickerDialog(getActivity(), this, year, month, day);
}
public void onDateSet(DatePicker view, int year, int month, int day) {
// Do something with the date chosen by the user
}
}
查看
DatePickerDialog类来了解关于它构造函数参数的消息。
现在你只需要将这个fragment实例添加到你的activity中去了。
展示日期选择器
一旦你像上面展示的一样定义了一个
DialogFragment,你可以通过创建一个
DialogFragment的引用再调用
show()
来展示该日期选择器。
例如,这里有个按钮,当点击它时,调用一个方法来展示该对话框:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pick_date"
android:onClick="showDatePickerDialog" />
当用户点击该按钮,系统调用如下方法:
public void showDatePickerDialog(View v) {
DialogFragment newFragment = new DatePickerFragment();
newFragment.show(getSupportFragmentManager(), "datePicker");
}
该方法在一个新的
DialogFragment引用中调用
show()
。
show()
方法要求有一个
FragmentManager的引用和fragment的唯一标签名。
警告:如果你的应用支持安卓3.0及其以下版本,确保你在调用
getSupportFragmentManager()
时获得了一个
FragmentManager
.的引用。也应该确保你展示该时间选择器的activity继承了
FragmentActivity而不是标准的
Activity
类。