@ -28,10 +28,18 @@ import android.view.View;
import android.widget.FrameLayout ;
import android.widget.FrameLayout ;
import android.widget.NumberPicker ;
import android.widget.NumberPicker ;
/ * *
* 日 期 选 择 器 , 是 [ FrameLayout ] 的 子 类
* /
public class DateTimePicker extends FrameLayout {
public class DateTimePicker extends FrameLayout {
private static final boolean DEFAULT_ENABLE_STATE = true ;
private static final boolean DEFAULT_ENABLE_STATE = true ;
/ * *
* 常 量 声 明 , 包 含 一 些 数 值 范 围 等
* 例 如 小 时 可 选 范 围 为 0 ~ 23 小 时
* 分 钟 可 选 范 围 为 0 ~ 59 分 钟
* /
private static final int HOURS_IN_HALF_DAY = 12 ;
private static final int HOURS_IN_HALF_DAY = 12 ;
private static final int HOURS_IN_ALL_DAY = 24 ;
private static final int HOURS_IN_ALL_DAY = 24 ;
private static final int DAYS_IN_ALL_WEEK = 7 ;
private static final int DAYS_IN_ALL_WEEK = 7 ;
@ -46,25 +54,59 @@ public class DateTimePicker extends FrameLayout {
private static final int AMPM_SPINNER_MIN_VAL = 0 ;
private static final int AMPM_SPINNER_MIN_VAL = 0 ;
private static final int AMPM_SPINNER_MAX_VAL = 1 ;
private static final int AMPM_SPINNER_MAX_VAL = 1 ;
/ * *
* 天 数 选 择 器
* /
private final NumberPicker mDateSpinner ;
private final NumberPicker mDateSpinner ;
/ * *
* 时 间 选 择 器
* /
private final NumberPicker mHourSpinner ;
private final NumberPicker mHourSpinner ;
/ * *
* 分 钟 选 择 器
* /
private final NumberPicker mMinuteSpinner ;
private final NumberPicker mMinuteSpinner ;
/ * *
* AM / PM 早 晚 选 择 器
* /
private final NumberPicker mAmPmSpinner ;
private final NumberPicker mAmPmSpinner ;
/ * *
* 日 期 实 例 对 象
* /
private Calendar mDate ;
private Calendar mDate ;
/ * *
* 日 期 显 示 的 数 值
* /
private String [ ] mDateDisplayValues = new String [ DAYS_IN_ALL_WEEK ] ;
private String [ ] mDateDisplayValues = new String [ DAYS_IN_ALL_WEEK ] ;
/ * *
* 是 否 是 早 晨
* /
private boolean mIsAm ;
private boolean mIsAm ;
/ * *
* 是 否 是 24 小 时 制
* /
private boolean mIs24HourView ;
private boolean mIs24HourView ;
/ * *
* 是 否 启 用
* /
private boolean mIsEnabled = DEFAULT_ENABLE_STATE ;
private boolean mIsEnabled = DEFAULT_ENABLE_STATE ;
/ * *
* 是 否 正 在 初 始 化 中
* /
private boolean mInitialising ;
private boolean mInitialising ;
/ * *
* 日 期 变 更 监 听 器
* /
private OnDateTimeChangedListener mOnDateTimeChangedListener ;
private OnDateTimeChangedListener mOnDateTimeChangedListener ;
/ * *
private NumberPicker . OnValueChangeListener mOnDateChangedListener = new NumberPicker . OnValueChangeListener ( ) {
* 数 值 改 变 监 听 器
*
* 在 数 值 更 改 时 同 步 修 改 mDate 的 数 值
* 并 刷 新 选 择 器 的 数 值
* 触 发 时 间 改 变 监 听 器
* /
private NumberPicker . OnValueChangeListener mOnDateChangedListener =
new NumberPicker . OnValueChangeListener ( ) {
@Override
@Override
public void onValueChange ( NumberPicker picker , int oldVal , int newVal ) {
public void onValueChange ( NumberPicker picker , int oldVal , int newVal ) {
mDate . add ( Calendar . DAY_OF_YEAR , newVal - oldVal ) ;
mDate . add ( Calendar . DAY_OF_YEAR , newVal - oldVal ) ;
@ -72,7 +114,12 @@ public class DateTimePicker extends FrameLayout {
onDateTimeChanged ( ) ;
onDateTimeChanged ( ) ;
}
}
} ;
} ;
/ * *
* 数 值 改 变 监 听 器
*
* 在 数 值 改 变 时 传 入 选 择 器 对 象 和 操 作 前 与 操 作 后 的 数 值
* 对 数 值 进 行 具 体 的 分 析
* /
private NumberPicker . OnValueChangeListener mOnHourChangedListener = new NumberPicker . OnValueChangeListener ( ) {
private NumberPicker . OnValueChangeListener mOnHourChangedListener = new NumberPicker . OnValueChangeListener ( ) {
@Override
@Override
public void onValueChange ( NumberPicker picker , int oldVal , int newVal ) {
public void onValueChange ( NumberPicker picker , int oldVal , int newVal ) {
@ -114,7 +161,9 @@ public class DateTimePicker extends FrameLayout {
}
}
}
}
} ;
} ;
/ * *
* 分 钟 改 变 监 听 器
* /
private NumberPicker . OnValueChangeListener mOnMinuteChangedListener = new NumberPicker . OnValueChangeListener ( ) {
private NumberPicker . OnValueChangeListener mOnMinuteChangedListener = new NumberPicker . OnValueChangeListener ( ) {
@Override
@Override
public void onValueChange ( NumberPicker picker , int oldVal , int newVal ) {
public void onValueChange ( NumberPicker picker , int oldVal , int newVal ) {
@ -143,7 +192,10 @@ public class DateTimePicker extends FrameLayout {
onDateTimeChanged ( ) ;
onDateTimeChanged ( ) ;
}
}
} ;
} ;
/ * *
* 早 晚 变 更 的 监 听 器
* 在 选 择 AM / PM 的 时 候 通 知 监 听 器 触 发 方 法
* /
private NumberPicker . OnValueChangeListener mOnAmPmChangedListener = new NumberPicker . OnValueChangeListener ( ) {
private NumberPicker . OnValueChangeListener mOnAmPmChangedListener = new NumberPicker . OnValueChangeListener ( ) {
@Override
@Override
public void onValueChange ( NumberPicker picker , int oldVal , int newVal ) {
public void onValueChange ( NumberPicker picker , int oldVal , int newVal ) {
@ -475,11 +527,19 @@ public class DateTimePicker extends FrameLayout {
public void setOnDateTimeChangedListener ( OnDateTimeChangedListener callback ) {
public void setOnDateTimeChangedListener ( OnDateTimeChangedListener callback ) {
mOnDateTimeChangedListener = callback ;
mOnDateTimeChangedListener = callback ;
}
}
/ * *
* 在 日 期 时 间 改 变 时 调 用 该 方 法
* 如 果 日 期 时 间 改 变 监 听 器 为 空 则 不 处 理
* 不 为 空 则 调 用 监 听 器 的 方 法
* /
private void onDateTimeChanged ( ) {
private void onDateTimeChanged ( ) {
if ( mOnDateTimeChangedListener ! = null ) {
if ( mOnDateTimeChangedListener = = null ) return ;
mOnDateTimeChangedListener . onDateTimeChanged ( this , getCurrentYear ( ) ,
mOnDateTimeChangedListener . onDateTimeChanged ( this ,
getCurrentMonth ( ) , getCurrentDay ( ) , getCurrentHourOfDay ( ) , getCurrentMinute ( ) ) ;
getCurrentYear ( ) ,
}
getCurrentMonth ( ) ,
getCurrentDay ( ) ,
getCurrentHourOfDay ( ) ,
getCurrentMinute ( )
) ;
}
}
}
}