实际上时间选择器TimePicker就是用NumberPicker实现的
一:默认的时间选择器TimePickerDialog貌似只有一个完成按钮,没有取消按钮
代码如下:
TimePickerDialog time = new TimePickerDialog(AppointActivity.this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Toast.makeText(AppointActivity.this, hourOfDay + "hour " + minute + "minute", Toast.LENGTH_SHORT).show();
}
}, 18, 25, true);
time.show();
二:使用AlertDialog.Builder自定义带确定和取消按钮的时间选择对话框
对话框的布局代码如下:
timepicker_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp"
>
<TimePicker
android:id="@+id/time_picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"></TimePicker>
</LinearLayout>
java代码:
/**
* 调用该方法弹出时间选择器dialog
*/
private void showTimePicker(){
AlertDialog.Builder builder = new AlertDialog.Builder(AppointActivity.this);
View view = (LinearLayout) getLayoutInflater().inflate(R.layout.timepicker_main, null);
final TimePicker timePicker = (TimePicker) view.findViewById(R.id.time_picker);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
timePicker.setIs24HourView(true);
timePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));
timePicker.setCurrentMinute(Calendar.MINUTE);
//如果需要设置分钟的时间间隔则调用该方法
// setNumberPickerTextSize(timePicker,minutsInterval);
builder.setView(view);
builder.setTitle("设置时间信息");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int mHour = timePicker.getCurrentHour();
//如果之前调用了setNumberPickerTextSize方法,则mMinute不是你选择的实际的分钟数,
//而是实际的分钟数所在数组的索引,mMinute*时间间隔才是实际的分钟数,
// 例如你选了30,30在分钟数组的索引是2(即mMinute),而分钟的间隔是15,则2*15=30
int mMinute = timePicker.getCurrentMinute();
Toast.makeText(AppointActivity.this, mHour + "hour: " + mMinute + "minute", Toast.LENGTH_SHORT).show();
dialog.cancel();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.create().show();
}
/**
*
* @param viewGroup 传入TimePicker
* @param minutes 待显示的分钟间隔数组,例如:String[] minutes = new String[]{"00","15","30","45"};
*/
private void setNumberPickerTextSize(ViewGroup viewGroup,String[] minutes){
List<NumberPicker> npList = findNumberPicker(viewGroup);
if (null != npList)
{
for (NumberPicker mMinuteSpinner : npList)
{
if(mMinuteSpinner.toString().contains("id/minute")){//对分钟进行间隔设置
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
mMinuteSpinner.setMinValue(0);
mMinuteSpinner.setMaxValue(minutes.length - 1);
mMinuteSpinner.setDisplayedValues(minutes); //分钟显示数组
}
}
}
}
}
private List<NumberPicker> findNumberPicker(ViewGroup viewGroup)
{
List<NumberPicker> npList = new ArrayList<NumberPicker>();
View child = null;
if (null != viewGroup)
{
for (int i = 0; i < viewGroup.getChildCount(); i++)
{
child = viewGroup.getChildAt(i);
if (child instanceof NumberPicker)
{
npList.add((NumberPicker)child);
}
else if (child instanceof LinearLayout)
{
List<NumberPicker> result = findNumberPicker((ViewGroup)child);
if (result.size() > 0)
{
return result;
}
}
}
}
return npList;
}
注:部分代码来自网络