如果想要實(shí)現(xiàn)日期/時(shí)間選擇器的需求,其實(shí)在安卓原生的控件中就已經(jīng)提供好了。TimePicker和DatePicker题诵。直接作用在xml文件中就可以看到效果(依據(jù)api不同會(huì)有不同的樣式)渣淳,但是有時(shí)候還需要將TimePicker和DatePicker連用放到同一個(gè)布局中,接下來(lái)可以來(lái)看下效果肥印。
- 首先記錄一下DatePickerDialog/TimePickerDialog的使用识椰,結(jié)構(gòu)上它們都是繼承自AlertDialog的。
/**
* 日期選擇
*
* @param activity
* @param themeResId
* @param tv
* @param calendar
*/
public static void showDatePickerDialog(Activity activity, int themeResId, final TextView tv, Calendar calendar) {
// 直接創(chuàng)建一個(gè)DatePickerDialog對(duì)話(huà)框?qū)嵗罴睿⑺@示出來(lái)
new DatePickerDialog(activity, themeResId, new DatePickerDialog.OnDateSetListener() {
// 綁定監(jiān)聽(tīng)器(How the parent is notified that the date is set.)
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
// 此處得到選擇的時(shí)間腹鹉,可以進(jìn)行你想要的操作
tv.setText("您選擇了:" + year + "年" + (monthOfYear + 1) + "月" + dayOfMonth + "日");
}
}
// 設(shè)置初始日期
, calendar.get(Calendar.YEAR)
, calendar.get(Calendar.MONTH)
, calendar.get(Calendar.DAY_OF_MONTH)
).show();
}
這里其實(shí)是將DatePickerDialog封裝了一下,在使用時(shí)themeResId會(huì)改變展示的效果敷硅,如果想要一個(gè)可以上下滾動(dòng)來(lái)選擇日期而不是直接使用日歷的方式來(lái)選擇功咒,保險(xiǎn)點(diǎn)的方式可以直接賦值為3。同時(shí)要需要傳入年月日這三個(gè)參數(shù)作為該日期選擇器一點(diǎn)開(kāi)默認(rèn)的日期绞蹦,可以傳遞你實(shí)際需求的日期也可以傳入當(dāng)前實(shí)際日期力奋,這里使用Calendar類(lèi)來(lái)獲取當(dāng)前系統(tǒng)日期。通過(guò)一個(gè)回調(diào)方法將選中的年月日賦值到控件上幽七。
/**
* 時(shí)間選擇
*
* @param activity
* @param themeResId
* @param tv
* @param calendar
*/
public static void showTimePickerDialog(Activity activity, int themeResId, final TextView tv, Calendar calendar) {
// Calendar c = Calendar.getInstance();
// 創(chuàng)建一個(gè)TimePickerDialog實(shí)例景殷,并把它顯示出來(lái)
new TimePickerDialog(activity, themeResId,
// 綁定監(jiān)聽(tīng)器
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
tv.setText("您選擇了:" + hourOfDay + "時(shí)" + minute + "分");
}
}
// 設(shè)置初始時(shí)間
, calendar.get(Calendar.HOUR_OF_DAY)
, calendar.get(Calendar.MINUTE)
// true表示采用24小時(shí)制
, true).show();
}
TimePickerDialog也是同樣的用法,注意TimePicker需要多設(shè)置一個(gè)是否12/24小時(shí)制。
- 接下來(lái)使用DatePicker和TimePicker來(lái)組合實(shí)現(xiàn)日期/時(shí)間選擇
/**
* 得到時(shí)間的view
*
* @param
* @return
*/
public void getDefDialog(Context ctx, final TextView textview) {
final Dialog dialog = new Dialog(ctx, R.style.smart_dialog);
View view = View.inflate(ctx, R.layout.view_def_date_dialog, null);
DatePicker dp_date = (DatePicker) view.findViewById(R.id.dp_date);
TimePicker tp_time = (TimePicker) view.findViewById(R.id.tp_time);
// dp_date.setCalendarViewShown(false);
final TextView tv_date = (TextView) view.findViewById(R.id.tv_date);
final TextView tv_time = (TextView) view.findViewById(R.id.tv_time);
LinearLayout ll_nowTime = (LinearLayout) view.findViewById(R.id.ll_nowTime);
final TextView tv_nowTime = (TextView) view.findViewById(R.id.tv_nowdate);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
final String nowTime = simpleDateFormat.format(new Date());
// tv_nowTime.setText(nowTime);
ll_nowTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
textview.setText(nowTime);
dialog.dismiss();
}
});
Button btn_dialog_cancel = (Button) view.findViewById(R.id.btn_dialog_cancel);
Button btn_dialog_ok = (Button) view.findViewById(R.id.btn_dialog_ok);
tp_time.setIs24HourView(true);
final int years = dp_date.getYear();
final int monthOfYears = dp_date.getMonth();
final int dayOfMonths = dp_date.getDayOfMonth();
tv_date.setText(years + "-" + (monthOfYears + 1) + "-" + dayOfMonths);
dp_date.init(years, monthOfYears, dayOfMonths, new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
tv_date.setText(year + "-" + (monthOfYear + 1) + "-" + dayOfMonth);
}
});
//使用Calendar類(lèi)通過(guò)設(shè)置時(shí)區(qū)的方式拿到正確的時(shí)刻
Calendar calendar = Calendar.getInstance();
//設(shè)置時(shí)區(qū)
calendar.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
int Hour = calendar.get(Calendar.HOUR_OF_DAY);
int Minute = calendar.get(Calendar.MINUTE);
tv_time.setText(Hour + ":" + Minute);
//設(shè)置時(shí)間選擇器上的默認(rèn)時(shí)間
tp_time.setCurrentHour(Hour);
tp_time.setCurrentMinute(Minute);
tp_time.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
tv_time.setText(hourOfDay + ":" + minute);
}
});
btn_dialog_cancel.setOnTouchListener(new ButtonTouchListener(ctx, btn_dialog_cancel));
btn_dialog_ok.setOnTouchListener(new ButtonTouchListener(ctx, btn_dialog_ok));
btn_dialog_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 點(diǎn)擊取消時(shí)應(yīng)該把選擇器上的時(shí)間重置
dialog.dismiss();
}
});
btn_dialog_ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
CharSequence date = tv_date.getText();
CharSequence time = tv_time.getText();
// 將時(shí)間格式統(tǒng)一 例如 2017-08-01 03:07:00
String dates = date + "";
String times = time + "";
String[] datess = dates.split("-");
if (datess[1].length() < 2) {
datess[1] = "0" + datess[1];
}
if (datess[2].length() < 2) {
datess[2] = "0" + datess[2];
}
String datesss = datess[0] + "-" + datess[1] + "-" + datess[2];
String[] timess = times.split(":");
if (timess[0].length() < 2) {
timess[0] = "0" + timess[0];
}
if (timess[1].length() < 2) {
timess[1] = "0" + timess[1];
}
String timesss = timess[0] + ":" + timess[1];
// String date_time = date + " " + time + ":00";
String date_time = datesss + " " + timesss + ":00";
textview.setText(date_time);
dialog.dismiss();
}
});
dialog.setContentView(view);
// 如果要去掉這個(gè)代碼,就得添加cancel監(jiān)聽(tīng)
dialog.setCancelable(false);
dialog.show();
}
這段代碼主要有兩部分乌奇,初始化設(shè)置和取到時(shí)間后對(duì)字符串進(jìn)行處理。注意在拿到month后還要對(duì)其+1因?yàn)閙onth值是從0開(kāi)始計(jì)數(shù)的绩蜻。取到時(shí)間后主要是通過(guò)對(duì)字符串截取判斷每一部分的字符數(shù)組是否符合格式要求并進(jìn)行處理。
- 遇到的問(wèn)題
- 自己的電腦好像環(huán)境變量有點(diǎn)問(wèn)題室埋,導(dǎo)致拿到的系統(tǒng)時(shí)間永遠(yuǎn)是格林威治時(shí)間(也就是慢了8個(gè)小時(shí))办绝,可以通過(guò)對(duì)Calendar類(lèi)或者SimpleDateFormat類(lèi)設(shè)置時(shí)區(qū)就可以拿到正確的時(shí)間了
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd kk:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
Toast.makeText(MyApplication.context, sdf.format(new Date()), Toast.LENGTH_SHORT).show();
// 或
Calendar now = Calendar.getInstance();
now.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
System.out.println(now.get(Calendar.HOUR_OF_DAY));
System.out.println(now.get(Calendar.MINUTE));
System.out.println(now.get(Calendar.SECOND));
- 在api21以上的機(jī)器中樣式會(huì)改變?yōu)槿諝v的形式來(lái)選擇日期。所以可以在xml代碼中增加如下配置姚淆,就可以將日歷改為上下滾動(dòng)來(lái)選擇日期了孕蝉。
DatePicker
android:datePickerMode="spinner"
android:calendarViewShown="false"
TimePicker
android:timePickerMode="spinner"