您的位置:首页 > 移动开发 > Android开发

Android日期时间选择对话框

2016-04-21 09:09 483 查看
/**
* @description:
* @author ldm
* @date 2016-4-21 上午9:02:49
*/
public class DateWidgets1 extends Activity {

// 显示时间TextView
private TextView mDateDisplay;

// 时间日期表示单位 :年/月/日/小时/分
private int mYear;
private int mMonth;
private int mDay;
private int mHour;
private int mMinute;
// 时间显示格式
static final int TIME_12_HOUR_STYLE = 0;// 12小时制
static final int TIME_24_HOUR_STYLE = 1;// 24小时制
static final int DATE_DIALOG = 2;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.date_widgets_example_1);
initCalendar();
initViewAndEvents();
updateDisplay();
}

private void initViewAndEvents() {
mDateDisplay = (TextView) findViewById(R.id.dateDisplay);
setDialogOnClickListener(R.id.pickDate, DATE_DIALOG);
setDialogOnClickListener(R.id.pickTime12, TIME_12_HOUR_STYLE);
setDialogOnClickListener(R.id.pickTime24, TIME_24_HOUR_STYLE);
}

private void initCalendar() {
final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);
mHour = c.get(Calendar.HOUR_OF_DAY);
mMinute = c.get(Calendar.MINUTE);
}

@SuppressWarnings("deprecation")
private void setDialogOnClickListener(int buttonId, final int dialogId) {
Button b = (Button) findViewById(buttonId);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDialog(dialogId);// showDialog()调用createDialog()和onPrepareDialog()
}
});
}

// 其中createDialog()调用onCreateDialog()。
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case TIME_12_HOUR_STYLE:
case TIME_24_HOUR_STYLE:
return new TimePickerDialog(this, mTimeSetListener, mHour, mMinute,
id == TIME_24_HOUR_STYLE);
case DATE_DIALOG:
return new DatePickerDialog(this, mDateSetListener, mYear, mMonth,
mDay);
}
return null;
}

// 每次弹出对话框时被回调以动态更新对话框内容的方法
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
switch (id) {
case TIME_12_HOUR_STYLE:
case TIME_24_HOUR_STYLE:
((TimePickerDialog) dialog).updateTime(mHour, mMinute);
break;
case DATE_DIALOG:
((DatePickerDialog) dialog).updateDate(mYear, mMonth, mDay);
break;
}
}

/**
* 在TextView中显示选择的时间
*
* @description:
* @author ldm
* @date 2016-4-21 上午8:47:38
*/
private void updateDisplay() {
StringBuffer sb = new StringBuffer();
sb.append("当前时间:").append(mMonth + 1).append("-").append(mDay)
.append("-").append(mYear).append(" ").append(addZero(mHour))
.append(":").append(addZero(mMinute));
mDateDisplay.setText(sb.toString());
}

private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {

public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
mYear = year;
mMonth = monthOfYear;
mDay = dayOfMonth;
updateDisplay();
}
};

private TimePickerDialog.OnTimeSetListener mTimeSetListener = new TimePickerDialog.OnTimeSetListener() {

public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
mHour = hourOfDay;
mMinute = minute;
updateDisplay();
}
};

private static String addZero(int num) {
if (num >= 10)
return String.valueOf(num);
else
return "0" + String.valueOf(num);
}
}


上面代码我们在点击事件中,直接调用的showDialog(dialogId)方法,就弹出了对应的对话框,这是为什么呢?查看Activity中
showDialog(dialogId)的原码知道:


showDialog(dialogId)中调用是以下方法:

public final boolean showDialog(int id, Bundle args) {
if (mManagedDialogs == null) {
mManagedDialogs = new SparseArray<ManagedDialog>();
}
ManagedDialog md = mManagedDialogs.get(id);
if (md == null) {
md = new ManagedDialog();
**md.mDialog = createDialog(id, null, args);**
if (md.mDialog == null) {
return false;
}
mManagedDialogs.put(id, md);
}

md.mArgs = args;
onPrepareDialog(id, md.mDialog, args);
md.mDialog.show();
return true;
}


上面加粗的一行中调用了Activity中的如下方法:

private Dialog createDialog(Integer dialogId, Bundle state, Bundle args) {
**final Dialog dialog = onCreateDialog(dialogId, args);**
if (dialog == null) {
return null;
}
dialog.dispatchOnCreate(state);
return dialog;
}


在showDialog(int id, Bundle args)方法中又调用了onCreateDialog(dialogId, args)方法,所以说showDialog()、onPrepareDialog()和onCreateDialog()的关系是:
showDialog()调用createDialog()和onPrepareDialog(),其中createDialog()调用onCreateDialog()。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: