android中的自定义时间选择器对话框

时间:2015-03-25 07:50:13

标签: android dialog android-timepicker

我想在android中创建一个自定义时间选择器对话框(HH:MM:SS),它可以在android os 2.3或更高版本中运行。我创建了自定义时间选择器对话框,但它只能使用4.0或更高版本,而不是2.3到3版本。

我在这里发布我的代码:

public class MyTimePickerDialog extends AlertDialog implements OnClickListener, 
    OnTimeChangedListener {

/**
 * The callback interface used to indicate the user is done filling in
 * the time (they clicked on the 'Set' button).
 */
public interface OnTimeSetListener {

    /**
     * @param view The view associated with this listener.
     * @param hourOfDay The hour that was set.
     * @param minute The minute that was set.
     */
    void onTimeSet(TimePicker view, int hourOfDay, int minute, int seconds);
}

private static final String HOUR = "hour";
private static final String MINUTE = "minute";
private static final String SECONDS = "seconds";
private static final String IS_24_HOUR = "is24hour";

private final TimePicker mTimePicker;
private final OnTimeSetListener mCallback;
private final Calendar mCalendar;
private final java.text.DateFormat mDateFormat;

int mInitialHourOfDay;
int mInitialMinute;
int mInitialSeconds;    
boolean mIs24HourView;

/**
 * @param context Parent.
 * @param callBack How parent is notified.
 * @param hourOfDay The initial hour.
 * @param minute The initial minute.
 * @param is24HourView Whether this is a 24 hour view, or AM/PM.
 */
public MyTimePickerDialog(Context context,
        OnTimeSetListener callBack,
        int hourOfDay, int minute, int seconds, boolean is24HourView) {

    this(context, 0,
            callBack, hourOfDay, minute, seconds, is24HourView);
}

/**
 * @param context Parent.
 * @param theme the theme to apply to this dialog
 * @param callBack How parent is notified.
 * @param hourOfDay The initial hour.
 * @param minute The initial minute.
 * @param is24HourView Whether this is a 24 hour view, or AM/PM.
 */
public MyTimePickerDialog(Context context,
        int theme,
        OnTimeSetListener callBack,
        int hourOfDay, int minute, int seconds, boolean is24HourView) {
    super(context, theme);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    mCallback = callBack;
    mInitialHourOfDay = hourOfDay;
    mInitialMinute = minute;
    mInitialSeconds = seconds;
    mIs24HourView = is24HourView;

    mDateFormat = DateFormat.getTimeFormat(context);
    mCalendar = Calendar.getInstance();
    updateTitle(mInitialHourOfDay, mInitialMinute, mInitialSeconds);

    setButton(context.getText(R.string.time_set), this);
    setButton2(context.getText(R.string.cancel), (OnClickListener) null);
    //setIcon(android.R.drawable.ic_dialog_time);

    LayoutInflater inflater = 
            (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.time_picker_dialog, null);
    setView(view);
    mTimePicker = (TimePicker) view.findViewById(R.id.timePicker);

    // initialize state
    mTimePicker.setCurrentHour(mInitialHourOfDay);
    mTimePicker.setCurrentMinute(mInitialMinute);
    mTimePicker.setCurrentSecond(mInitialSeconds);
    mTimePicker.setIs24HourView(mIs24HourView);
    mTimePicker.setOnTimeChangedListener(this);      
}

public void onClick(DialogInterface dialog, int which) {
    if (mCallback != null) {
        mTimePicker.clearFocus();
        mCallback.onTimeSet(mTimePicker, mTimePicker.getCurrentHour(), 
                mTimePicker.getCurrentMinute(), mTimePicker.getCurrentSeconds());
    }
}

public void onTimeChanged(TimePicker view, int hourOfDay, int minute, int seconds) {
    updateTitle(hourOfDay, minute, seconds);
}

public void updateTime(int hourOfDay, int minutOfHour, int seconds) {
    mTimePicker.setCurrentHour(hourOfDay);
    mTimePicker.setCurrentMinute(minutOfHour);
    mTimePicker.setCurrentSecond(seconds);
}

private void updateTitle(int hour, int minute, int seconds) {
    mCalendar.set(Calendar.HOUR_OF_DAY, hour);
    mCalendar.set(Calendar.MINUTE, minute);
    mCalendar.set(Calendar.SECOND, seconds);
    setTitle(mDateFormat.format(mCalendar.getTime()) + ":" + String.format("%02d" , seconds));
}

@Override
public Bundle onSaveInstanceState() {
    Bundle state = super.onSaveInstanceState();
    state.putInt(HOUR, mTimePicker.getCurrentHour());
    state.putInt(MINUTE, mTimePicker.getCurrentMinute());
    state.putInt(SECONDS, mTimePicker.getCurrentSeconds());
    state.putBoolean(IS_24_HOUR, mTimePicker.is24HourView());
    return state;
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    int hour = savedInstanceState.getInt(HOUR);
    int minute = savedInstanceState.getInt(MINUTE);
    int seconds = savedInstanceState.getInt(SECONDS);
    mTimePicker.setCurrentHour(hour);
    mTimePicker.setCurrentMinute(minute);
    mTimePicker.setCurrentSecond(seconds);
    mTimePicker.setIs24HourView(savedInstanceState.getBoolean(IS_24_HOUR));
    mTimePicker.setOnTimeChangedListener(this);
    updateTitle(hour, minute, seconds);
}}

TimerPicker类

public class TimePicker extends FrameLayout {

/**
 * A no-op callback used in the constructor to avoid null checks
 * later in the code.
 */
private static final OnTimeChangedListener NO_OP_CHANGE_LISTENER = new OnTimeChangedListener() {
    public void onTimeChanged(TimePicker view, int hourOfDay, int minute, int seconds) {
    }
};

public static final NumberPicker.Formatter TWO_DIGIT_FORMATTER =
        new Formatter() {

        @Override
        public String format(int value) {
        // TODO Auto-generated method stub
        return String.format("%02d", value);
    }
};

// state
private int mCurrentHour = 0; // 0-23
private int mCurrentMinute = 0; // 0-59
private int mCurrentSeconds = 0; // 0-59
private Boolean mIs24HourView = false;
private boolean mIsAm;

// ui components
private final NumberPicker mHourPicker;
private final NumberPicker mMinutePicker;
private final NumberPicker mSecondPicker;
private final Button mAmPmButton;
private final String mAmText;
private final String mPmText;

// callbacks
private OnTimeChangedListener mOnTimeChangedListener;

/**
 * The callback interface used to indicate the time has been adjusted.
 */
public interface OnTimeChangedListener {

    /**
     * @param view The view associated with this listener.
     * @param hourOfDay The current hour.
     * @param minute The current minute.
     * @param seconds The current second.
     */
    void onTimeChanged(TimePicker view, int hourOfDay, int minute, int seconds);
}

public TimePicker(Context context) {
    this(context, null);
}

public TimePicker(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public TimePicker(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

    LayoutInflater inflater =
            (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate(R.layout.time_picker_widget,
        this, // we are the parent
        true);

    // hour
    mHourPicker = (NumberPicker) findViewById(R.id.hour);
    mHourPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {

        @Override
        public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
            // TODO Auto-generated method stub
            mCurrentHour = newVal;
            if (!mIs24HourView) {
                // adjust from [1-12] to [0-11] internally, with the times
                // written "12:xx" being the start of the half-day
                if (mCurrentHour == 12) {
                    mCurrentHour = 0;
                }
                if (!mIsAm) {
                    // PM means 12 hours later than nominal
                    mCurrentHour += 12;
                }
            }
            onTimeChanged();
        }
    }); 

    // digits of minute
    mMinutePicker = (NumberPicker) findViewById(R.id.minute);
    mMinutePicker.setMinValue(0);
    mMinutePicker.setMaxValue(59);
    mMinutePicker.setFormatter(TWO_DIGIT_FORMATTER);
    mMinutePicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
        @Override
        public void onValueChange(NumberPicker spinner, int oldVal, int newVal) {
            mCurrentMinute = newVal;
            onTimeChanged();
        }
    });

 // digits of seconds
    mSecondPicker = (NumberPicker) findViewById(R.id.seconds);
    mSecondPicker.setMinValue(0);
    mSecondPicker.setMaxValue(59);
    mSecondPicker.setFormatter( TWO_DIGIT_FORMATTER);
    mSecondPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {

        @Override
        public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
             mCurrentSeconds = newVal;
                onTimeChanged();

        }
    });

    // am/pm
    mAmPmButton = (Button) findViewById(R.id.amPm);

    // now that the hour/minute picker objects have been initialized, set
    // the hour range properly based on the 12/24 hour display mode.
    configurePickerRanges();

    // initialize to current time
    Calendar cal = Calendar.getInstance();
    setOnTimeChangedListener(NO_OP_CHANGE_LISTENER);

    // by default we're not in 24 hour mode
    setCurrentHour(cal.get(Calendar.HOUR_OF_DAY));
    setCurrentMinute(cal.get(Calendar.MINUTE));
    setCurrentSecond(cal.get(Calendar.SECOND));

    mIsAm = (mCurrentHour < 12);

    /* Get the localized am/pm strings and use them in the spinner */
    DateFormatSymbols dfs = new DateFormatSymbols();
    String[] dfsAmPm = dfs.getAmPmStrings();
    mAmText = dfsAmPm[Calendar.AM];
    mPmText = dfsAmPm[Calendar.PM];
    mAmPmButton.setText(mIsAm ? mAmText : mPmText);
    mAmPmButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            requestFocus();
            if (mIsAm) {

                // Currently AM switching to PM
                if (mCurrentHour < 12) {
                    mCurrentHour += 12;
                }                
            } else {

                // Currently PM switching to AM
                if (mCurrentHour >= 12) {
                    mCurrentHour -= 12;
                }
            }
            mIsAm = !mIsAm;
            mAmPmButton.setText(mIsAm ? mAmText : mPmText);
            onTimeChanged();
        }
    });

    if (!isEnabled()) {
        setEnabled(false);
    }
}

@Override
public void setEnabled(boolean enabled) {
    super.setEnabled(enabled);
    mMinutePicker.setEnabled(enabled);
    mHourPicker.setEnabled(enabled);
    mAmPmButton.setEnabled(enabled);
}

/**
 * Used to save / restore state of time picker
 */
private static class SavedState extends BaseSavedState {

    private final int mHour;
    private final int mMinute;

    private SavedState(Parcelable superState, int hour, int minute) {
        super(superState);
        mHour = hour;
        mMinute = minute;
    }

    private SavedState(Parcel in) {
        super(in);
        mHour = in.readInt();
        mMinute = in.readInt();
    }

    public int getHour() {
        return mHour;
    }

    public int getMinute() {
        return mMinute;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        super.writeToParcel(dest, flags);
        dest.writeInt(mHour);
        dest.writeInt(mMinute);
    }

    public static final Parcelable.Creator<SavedState> CREATOR
            = new Creator<SavedState>() {
        public SavedState createFromParcel(Parcel in) {
            return new SavedState(in);
        }

        public SavedState[] newArray(int size) {
            return new SavedState[size];
        }
    };
}

@Override
protected Parcelable onSaveInstanceState() {
    Parcelable superState = super.onSaveInstanceState();
    return new SavedState(superState, mCurrentHour, mCurrentMinute);
}

@Override
protected void onRestoreInstanceState(Parcelable state) {
    SavedState ss = (SavedState) state;
    super.onRestoreInstanceState(ss.getSuperState());
    setCurrentHour(ss.getHour());
    setCurrentMinute(ss.getMinute());
}

/**
 * Set the callback that indicates the time has been adjusted by the user.
 * @param onTimeChangedListener the callback, should not be null.
 */
public void setOnTimeChangedListener(OnTimeChangedListener onTimeChangedListener) {
    mOnTimeChangedListener = onTimeChangedListener;
}

/**
 * @return The current hour (0-23).
 */
public Integer getCurrentHour() {
    return mCurrentHour;
}

/**
 * Set the current hour.
 */
public void setCurrentHour(Integer currentHour) {
    this.mCurrentHour = currentHour;
    updateHourDisplay();
}

/**
 * Set whether in 24 hour or AM/PM mode.
 * @param is24HourView True = 24 hour mode. False = AM/PM.
 */
public void setIs24HourView(Boolean is24HourView) {
    if (mIs24HourView != is24HourView) {
        mIs24HourView = is24HourView;
        configurePickerRanges();
        updateHourDisplay();
    }
}

/**
 * @return true if this is in 24 hour view else false.
 */
public boolean is24HourView() {
    return mIs24HourView;
}

/**
 * @return The current minute.
 */
public Integer getCurrentMinute() {
    return mCurrentMinute;
}

/**
 * Set the current minute (0-59).
 */
public void setCurrentMinute(Integer currentMinute) {
    this.mCurrentMinute = currentMinute;
    updateMinuteDisplay();
}

/**
 * @return The current minute.
 */
public Integer getCurrentSeconds() {
    return mCurrentSeconds;
}

/**
 * Set the current second (0-59).
 */
public void setCurrentSecond(Integer currentSecond) {
    this.mCurrentSeconds = currentSecond;
    updateSecondsDisplay();
}

@Override
public int getBaseline() {
    return mHourPicker.getBaseline(); 
}

/**
 * Set the state of the spinners appropriate to the current hour.
 */
private void updateHourDisplay() {
    int currentHour = mCurrentHour;
    if (!mIs24HourView) {
        // convert [0,23] ordinal to wall clock display
        if (currentHour > 12) currentHour -= 12;
        else if (currentHour == 0) currentHour = 12;
    }
    mHourPicker.setValue(currentHour);
    mIsAm = mCurrentHour < 12;
    mAmPmButton.setText(mIsAm ? mAmText : mPmText);
    onTimeChanged();
}

private void configurePickerRanges() {
    if (mIs24HourView) {
        mHourPicker.setMinValue(0);
        mHourPicker.setMaxValue(23);
        mHourPicker.setFormatter(TWO_DIGIT_FORMATTER);
        mAmPmButton.setVisibility(View.GONE);
    } else {           
        mHourPicker.setMinValue(1);
        mHourPicker.setMaxValue(12);
        mHourPicker.setFormatter(null);
        mAmPmButton.setVisibility(View.VISIBLE);
    }
}

private void onTimeChanged() {
    mOnTimeChangedListener.onTimeChanged(this, getCurrentHour(), getCurrentMinute(), getCurrentSeconds());
}

/**
 * Set the state of the spinners appropriate to the current minute.
 */
private void updateMinuteDisplay() {
    mMinutePicker.setValue(mCurrentMinute);
    mOnTimeChangedListener.onTimeChanged(this, getCurrentHour(), getCurrentMinute(), getCurrentSeconds());
}

/**
 * Set the state of the spinners appropriate to the current second.
 */
private void updateSecondsDisplay() {
    mSecondPicker.setValue(mCurrentSeconds);
    mOnTimeChangedListener.onTimeChanged(this, getCurrentHour(), getCurrentMinute(), getCurrentSeconds());
}}

2 个答案:

答案 0 :(得分:0)

使用它:

TimePickerDialog tpd = new TimePickerDialog(this,
                new TimePickerDialog.OnTimeSetListener() {

    @Override
    public void onTimeSet(TimePicker view, int hourOfDay,
                            int minute) {
         // Display Selected time in textbox
        if (hourOfDay < 10 && minute < 10) {
            txtTime.setText("0" + hourOfDay + ":" + "0" + minute);
        } else if (minute < 10) {
            txtTime.setText(hourOfDay + ":" + "0" + minute);
        } else {
            txtTime.setText(hourOfDay + ":" + minute);
        }
       Log.e("H", String.valueOf(hourOfDay));
       Log.e("M", String.valueOf(minute));
    }
}, mHour, mMinute, false);
tpd.show();

希望这可以在任何地方使用..

答案 1 :(得分:0)

   For Custom time picker dialog , I think below links might be helps to you

   1) https://github.com/ziaagikian/Custom-Time-Picker-Dialog


    2) http://www.android-ios-tutorials.com/android/android-datepickerdialog-timepickerdialog/



    3) http://sunil-android.blogspot.in/2013/09/custom-time-picker-with-time-interval.html