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()。
相关文章推荐
- [调试] 打印类名方法名行数的Log日志
- Fragment生命周期
- Android之RadioGroup+ViewPager制作的底部导航栏
- Android SharedPreferences详解
- android基础---->音频和视频的使用
- 第十二章 、Bitmap的加载和Cache
- 第十一章、Android的线程和线程池
- 第十章、Android的消息机制
- 让我们一起来做最漂亮的Android界面吧!
- 第九章、 四大组件的工作过程
- Android全局异常统一处理
- android音视频点/直播模块开发
- android学习13——android egl hello world
- Android LayoutInflater详解
- 【Android】自定义FlowLayout,支持多种布局优化--android-flowlayout
- 使用AndroidEventBus
- Android必知必会-Fragment监听返回键事件
- Android必知必会-Fragment监听返回键事件
- Android项目开发填坑记-Fragment的onAttach
- Android项目开发填坑记-Fragment的onAttach