• 完全参照系统自带的DatePickerDialog、TimePickerDialog的源代码仿写的DateTimePickerDialog


    完全参照系统自带的DatePickerDialog、TimePickerDialog的源代码仿写的DateTimePickerDialog。具有同时选择日期、时间的功能。
    在2.2、2.3平台,显示的效果可能会有一个大背景框在后面。4.0以上平台无此现象。此怪异效果通过各种手段未能解决。功能不影响正常使用。

    import java.util.Calendar;
    
    import android.app.AlertDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.DialogInterface.OnClickListener;
    import android.os.Bundle;
    import android.text.format.DateUtils;
    import android.view.Gravity;
    import android.view.ViewGroup.LayoutParams;
    import android.widget.DatePicker;
    import android.widget.DatePicker.OnDateChangedListener;
    import android.widget.LinearLayout;
    import android.widget.TimePicker;
    import android.widget.TimePicker.OnTimeChangedListener;
    
    /**
     * 完全参照系统自带的DatePickerDialog、TimePickerDialog的源代码仿写的DateTimePickerDialog。具有同时选择日期、时间的功能。<br>
     * 在2.2、2.3平台,显示的效果可能会有一个大背景框在后面。4.0以上平台无此现象。怪异的原因未能解决。
     * @author AsionTang
     * @since 2014年2月26日 17:02:24
     */
    public class DateTimePickerDialog extends AlertDialog implements OnClickListener, OnDateChangedListener, OnTimeChangedListener
    {
        private final OnDateTimeChangedListener mCallback;
    
        private final DatePicker mDatePicker;
    
        private final TimePicker mTimePicker;
    
        private static final String HOUR = "hour";
    
        private static final String MINUTE = "minute";
    
        private static final String IS_24_HOUR = "is24hour";
    
        private static final String YEAR = "year";
    
        private static final String MONTH = "month";
    
        private static final String DAY = "day";
    
        private final Calendar mCalendar;
    
        public DateTimePickerDialog(final Context context, final int theme, final OnDateTimeChangedListener callBack)
        {
        super(context, theme);
        this.mCallback = callBack;
        this.mCalendar = Calendar.getInstance();
        this.updateTitle();
    
        this.setButton(BUTTON_POSITIVE, context.getText(android.R.string.ok), this);
        this.setButton(BUTTON_NEGATIVE, context.getText(android.R.string.cancel), (OnClickListener) null);
    
        this.mDatePicker = new DatePicker(context);
        this.mDatePicker.init(this.mCalendar.get(Calendar.YEAR), this.mCalendar.get(Calendar.MONTH), this.mCalendar.get(Calendar.DAY_OF_MONTH), this);
    
        this.mTimePicker = new TimePicker(context);
        this.mTimePicker.setIs24HourView(true);
        this.mTimePicker.setCurrentHour(this.mCalendar.get(Calendar.HOUR_OF_DAY));
        this.mTimePicker.setCurrentMinute(this.mCalendar.get(Calendar.MINUTE));
        this.mTimePicker.setOnTimeChangedListener(this);
    
        final LinearLayout linearLayout = new LinearLayout(context);
        linearLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        linearLayout.setOrientation(LinearLayout.VERTICAL);//默认为HORIZONTAL(水平)
        linearLayout.setGravity(Gravity.CENTER);
        linearLayout.addView(this.mDatePicker);
        linearLayout.addView(this.mTimePicker);
        this.setView(linearLayout);
        }
    
        public DateTimePickerDialog(final Context context, final OnDateTimeChangedListener callBack)
        {
        this(context, 0, callBack);
        }
    
        /**
         * Gets the {@link DatePicker} contained in this dialog.
         * 
         * @return The DatePicker view.
         */
        public DatePicker getDatePicker()
        {
        return this.mDatePicker;
        }
    
        /**
         * Gets the {@link TimePicker} contained in this dialog.
         * 
         * @return The TimePicker view.
         */
        public TimePicker getTimePicker()
        {
        return this.mTimePicker;
        }
    
        @Override
        public void onClick(final DialogInterface dialog, final int which)
        {
        this.tryNotifyDateTimeSet();
        }
    
        @Override
        public void onDateChanged(final DatePicker view, final int year, final int month, final int day)
        {
        this.mDatePicker.init(year, month, day, this);
    
        this.mCalendar.set(Calendar.YEAR, year);
        this.mCalendar.set(Calendar.MONTH, month);
        this.mCalendar.set(Calendar.DAY_OF_MONTH, day);
    
        this.updateTitle();
        }
    
        @Override
        public void onRestoreInstanceState(final Bundle savedInstanceState)
        {
        super.onRestoreInstanceState(savedInstanceState);
        final int year = savedInstanceState.getInt(YEAR);
        final int month = savedInstanceState.getInt(MONTH);
        final int day = savedInstanceState.getInt(DAY);
        this.mDatePicker.init(year, month, day, this);
    
        final int hour = savedInstanceState.getInt(HOUR);
        final int minute = savedInstanceState.getInt(MINUTE);
        this.mTimePicker.setIs24HourView(savedInstanceState.getBoolean(IS_24_HOUR));
        this.mTimePicker.setCurrentHour(hour);
        this.mTimePicker.setCurrentMinute(minute);
        }
    
        @Override
        public Bundle onSaveInstanceState()
        {
        final Bundle state = super.onSaveInstanceState();
        state.putInt(YEAR, this.mDatePicker.getYear());
        state.putInt(MONTH, this.mDatePicker.getMonth());
        state.putInt(DAY, this.mDatePicker.getDayOfMonth());
    
        state.putInt(HOUR, this.mTimePicker.getCurrentHour());
        state.putInt(MINUTE, this.mTimePicker.getCurrentMinute());
        state.putBoolean(IS_24_HOUR, this.mTimePicker.is24HourView());
    
        return state;
        }
    
        @Override
        public void onTimeChanged(final TimePicker view, final int hourOfDay, final int minute)
        {
        this.mCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
        this.mCalendar.set(Calendar.MINUTE, minute);
        }
    
        public void setDate(final int year, final int monthOfYear, final int dayOfMonth)
        {
        this.mDatePicker.updateDate(year, monthOfYear, dayOfMonth);
        }
    
        public void setDateAndTime(final int year, final int monthOfYear, final int dayOfMonth, final int hour, final int minute,
            final boolean is24HourView)
        {
        this.setDate(year, monthOfYear, dayOfMonth);
        this.setTime(hour, minute, is24HourView);
        }
    
        public void setTime(final int hour, final int minute, final boolean is24HourView)
        {
        this.mTimePicker.setIs24HourView(is24HourView);
        this.mTimePicker.setCurrentHour(hour);
        this.mTimePicker.setCurrentMinute(minute);
        }
    
        private void tryNotifyDateTimeSet()
        {
        if (this.mCallback != null)
        {
            this.mDatePicker.clearFocus();
            this.mTimePicker.clearFocus();
            this.mCallback.onDateTimeChanged(this.mDatePicker, this.mTimePicker//
                , this.mDatePicker.getYear(), this.mDatePicker.getMonth(), this.mDatePicker.getDayOfMonth()//
                , this.mTimePicker.getCurrentHour(), this.mTimePicker.getCurrentMinute());
        }
        }
    
        private void updateTitle()
        {
        final String title = DateUtils.formatDateTime(this.getContext(), this.mCalendar.getTimeInMillis()//
            , DateUtils.FORMAT_SHOW_DATE//
                | DateUtils.FORMAT_NO_YEAR//
                | DateUtils.FORMAT_SHOW_WEEKDAY);
        this.setTitle(title);
        }
    
        public interface OnDateTimeChangedListener
        {
        void onDateTimeChanged(DatePicker dateView, TimePicker timeView, int year, int monthOfYear, int dayOfMonth, int hourOfDay, int minute);
        }
    }
    作者:Asion Tang
    凡是没有注明[转载]的文章,本Blog发表的文章版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    [置顶] java 通过classloader加载类再通过classforname实例化
    Linux内核源代码解析——用户发送数据包的起源之sendto
    POJ 2774 Long Long Message&&HDU 1403 Longest Common Substring&&COJ 1203
    add-two-numbers-ii
    【转载】React初学者入门须知
    【Todo】【转载】ES6的学习记录
    【转载】Java中如何写一段内存泄露的程序 & ThreadLocal 介绍和使用
    【Todo】深入理解Javascript系列
    【转载】什么是优秀技术团队
    【转载】React入门-Todolist制作学习
  • 原文地址:https://www.cnblogs.com/AsionTang/p/3569695.html
Copyright © 2020-2023  润新知