Android日期时间选择对话框

/**
 * @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()。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值