前言
話說(shuō)日期時(shí)間選擇控件許多項(xiàng)目都會(huì)用到谆棺,今天小可不才疚沐,也發(fā)一個(gè)自己寫的日期選擇控件
先上圖
1暂氯、首先自定義日期選擇工具類
里面注釋比較詳細(xì),我就不在這里一一贅述了亮蛔。
/**
* 日期時(shí)間選擇控件 使用方法: private EditText inputDate;<br>
* 需要設(shè)置的日期時(shí)間文本編輯框 private String initDateTime="2012年9月3 日 14:44",初始日期時(shí)間值
* 在點(diǎn)擊事件中使用: inputDate.setOnClickListener(new OnClickListener()
*/
public class DatePickerDialogUtil implements OnDateChangedListener,
OnTimeChangedListener {
/** 日期選擇 */
private DatePicker mDateChoose;
/** 時(shí)間選擇 */
private TimePicker mTimeChoose;
/** 對(duì)話框 */
private AlertDialog mDialog;
/** 設(shè)置時(shí)間 */
private String mDateTime;
/** 初始化時(shí)間 */
private String mInitDateTime;
private final SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy年MM月dd日 HH:mm:ss");
/** 顯示時(shí)間 */
private String showDate;
/** Activity對(duì)象 */
private final Activity mActivity;
/**
* 日期時(shí)間彈出選擇框函數(shù)
*
* @param activity
* 調(diào)用父Activity
* @param dateTime
* 初始日期時(shí)間值痴施,作為彈出窗口的標(biāo)題和日期時(shí)間初始值
*/
public DatePickerDialogUtil(Activity activity, String dateTime) {
this.mActivity = activity;
this.mInitDateTime = dateTime;
}
/**
* 初始化時(shí)間日期
*
* @param datePicker
* 日期
* @param timePicker
* 時(shí)間
*/
public void init(DatePicker datePicker, TimePicker timePicker) {
// 初始化Calendar
Calendar calendar = Calendar.getInstance();
// datePicker不等于空,并且初始化時(shí)間不為空
if (!(datePicker == null || "".equals(mInitDateTime))) {
} else {
mInitDateTime = calendar.get(Calendar.YEAR) + "年"
+ calendar.get(Calendar.MONTH) + "月"
+ calendar.get(Calendar.DAY_OF_MONTH) + "日"
+ calendar.get(Calendar.HOUR_OF_DAY) + ":"
+ calendar.get(Calendar.MINUTE);
}
// 初始化時(shí)間
mDateChoose.init(calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH), this);
// 設(shè)置當(dāng)前時(shí)間
mTimeChoose.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));
// 設(shè)置當(dāng)前分鐘
mTimeChoose.setCurrentMinute(calendar.get(Calendar.MINUTE));
}
/**
* 彈出日期時(shí)間選擇框方法
*
* @param dateText
* 需要設(shè)置的日期時(shí)間選擇框
* @return
*/
public AlertDialog datePickerDialog(final Button dateText) {
LinearLayout mInflater = (LinearLayout) mActivity.getLayoutInflater()
.inflate(R.layout.datepicker_dialog, null);
mDateChoose = (DatePicker) mInflater.findViewById(R.id.date_choose);
mTimeChoose = (TimePicker) mInflater.findViewById(R.id.time_choose);
// 初始化日期時(shí)間
init(mDateChoose, mTimeChoose);
// 設(shè)置日期為24小時(shí)制
mTimeChoose.setIs24HourView(true);
// 時(shí)間改變事件監(jiān)聽(tīng)器
mTimeChoose.setOnTimeChangedListener(this);
showDate = sdf.format(System.currentTimeMillis());
// 創(chuàng)建對(duì)話框
mDialog = new AlertDialog.Builder(mActivity).setTitle(mInitDateTime)
.setView(mInflater)
.setPositiveButton("設(shè)置", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dateText.setText(mDateTime);
}
}).setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dateText.setText(showDate);
}
}).show();
// 設(shè)置日期改變
onDateChanged(null, 0, 0, 0);
return mDialog;
}
/**
* 時(shí)間監(jiān)聽(tīng)器
*/
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
// 設(shè)置日期改變
onDateChanged(null, 0, 0, 0);
}
/**
* 日期監(jiān)聽(tīng)器
*/
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// 獲取日歷實(shí)例
Calendar calendar = Calendar.getInstance();
// 設(shè)置當(dāng)前日期和時(shí)間
calendar.set(mDateChoose.getYear(), mDateChoose.getMonth(),
mDateChoose.getDayOfMonth(), mTimeChoose.getCurrentHour(),
mTimeChoose.getCurrentMinute());
// 格式化字符串
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm");
mDateTime = sdf.format(calendar.getTime());
mDialog.setTitle(mDateTime);
}
/**
* 截取字符串
*
* @param src
* 數(shù)據(jù)源
* @param pattern
* 匹配模式
* @param indexOrLast
* 最后一個(gè)下標(biāo)
* @param frontOrBack
* 取前面的值還是后面的值
* @return
*/
public static String spliteString(String src, String pattern,
String indexOrLast, String frontOrBack) {
// 結(jié)果
String result = "";
int location = -1;
// 不分大小寫相等比較,如果是當(dāng)前下標(biāo)
if (indexOrLast.equalsIgnoreCase("index")) {
// 取得字符串第一次出現(xiàn)的地方
location = src.indexOf(pattern);
} else {
// 字符串最后一個(gè)匹配的位置
location = src.lastIndexOf(pattern);
}
// 不分大小寫相等比較辣吃,如果實(shí)在前面
if (frontOrBack.equalsIgnoreCase("front")) {
if (location != -1) {
// 截取字符串
result = src.substring(0, location);
} else {
if (location != -1) {
// 截取字符串
result = src.substring(location + 1, src.length());
}
}
}
return result;
}
/**
* 實(shí)現(xiàn)將初始日期時(shí)間2016年01月10日 16:45 拆分成年 月 日 時(shí) 分 秒,并賦值給calendar
*
* @param initDateTime
* 初始日期時(shí)間值 字符串型
* @return Calendar
*/
private Calendar getCalendarByInitDate(String initDateTime) {
// 獲取日歷實(shí)例
Calendar calendar = Calendar.getInstance();
/*
* 將初始日期時(shí)間2016年01月10日 16:45 拆分成年 月 日 時(shí) 分 秒
*/
// 日期
String date = spliteString(mInitDateTime, "日", "index", "front");
// 時(shí)間
String time = spliteString(mInitDateTime, "日", "index", "back");
// 年份
String year = spliteString(date, "年", "index", "front");
// 月分和日期
String monthAndDay = spliteString(date, "年", "index", "back");
// 月
String month = spliteString(monthAndDay, "月", "index", "front");
// 日
String dayOfMonth = spliteString(monthAndDay, "月", "index", "back");
// 時(shí)
String hour = spliteString(time, ":", "index", "front");
// 分
String minute = spliteString(time, ":", "index", "back");
// 獲取當(dāng)前年份
int currentYear = Integer.valueOf(year.trim()).intValue();
// 獲取當(dāng)前月份
int currentMonth = Integer.valueOf(month.trim()).intValue();
// 獲取當(dāng)前日
int currentDay = Integer.valueOf(dayOfMonth.trim()).intValue();
// 獲取當(dāng)前時(shí)
int currentHour = Integer.valueOf(hour.trim()).intValue();
// 獲取當(dāng)前分
int currentMinute = Integer.valueOf(minute.trim()).intValue();
// 設(shè)置當(dāng)前年动遭、月、日神得、時(shí)厘惦、分
calendar.set(currentYear, currentMonth, currentDay, currentHour,
currentMinute);
return calendar;
}
}
2、布局文件
布局里面就一個(gè)日期和時(shí)間選擇控件哩簿,這里無(wú)需多言宵蕉,相信各位看官都能看懂
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical" >
<DatePicker
android:id="@+id/date_choose"
android:layout_width="match_parent"
android:layout_height="0dp"
android:calendarViewShown="false"
android:layout_weight="1" />
<TimePicker
android:id="@+id/time_choose"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
3、如何調(diào)用
請(qǐng)看如下使用方法
public class MainActivity extends Activity implements OnClickListener {
/** 開(kāi)始時(shí)間 */
private Button mBtnStart;
/** 結(jié)束時(shí)間 */
private Button mBtnEnd;
/** 設(shè)置文本按鈕 */
private Button mBtnSetting;
/** 設(shè)置字體樣式按鈕 */
private Button mBtnSetShaow;
private final SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy年MM月dd日 HH:mm:ss");
/** 初始化開(kāi)始時(shí)間 */
protected String mInitDateTimeStart;
/** 初始化結(jié)束時(shí)間 */
protected String mInitDateTimeEnd;
/** DatePickerDialogUtil類 */
private DatePickerDialogUtil mDatePickerDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
mInitDateTimeStart = sdf.format(System.currentTimeMillis());
mInitDateTimeEnd = sdf.format(System.currentTimeMillis());
mBtnStart = (Button) findViewById(R.id.btn_start);
mBtnStart.setText(mInitDateTimeStart);
mBtnStart.setOnClickListener(this);
mBtnEnd = (Button) findViewById(R.id.btn_end);
mBtnEnd.setText(mInitDateTimeEnd);
mBtnEnd.setOnClickListener(this);
mBtnSetting = (Button) findViewById(R.id.btn_textSet);
mBtnSetting.setOnClickListener(this);
mBtnSetShaow = (Button) findViewById(R.id.btn_setShaow);
mBtnSetShaow.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_start: {// 開(kāi)始時(shí)間按鈕
mDatePickerDialog = new DatePickerDialogUtil(this,
mInitDateTimeStart);
mDatePickerDialog.datePickerDialog(mBtnStart);
break;
}
case R.id.btn_end: {// 結(jié)束時(shí)間按鈕
mDatePickerDialog = new DatePickerDialogUtil(this, mInitDateTimeEnd);
mDatePickerDialog.datePickerDialog(mBtnEnd);
break;
}
case R.id.btn_textSet: {// 設(shè)置文本按鈕
Intent intent = new Intent(this, TextSetActivity.class);
startActivity(intent);
break;
}
case R.id.btn_setShaow: {// 設(shè)置字體樣式按鈕
Intent intent = new Intent(this, SetTextViewActivity.class);
startActivity(intent);
break;
}
}
}
}
結(jié)語(yǔ)
圖比較丑节榜,還請(qǐng)各位見(jiàn)諒羡玛,打臉輕點(diǎn)。代碼很簡(jiǎn)單宗苍,相信各位都可以看懂,知識(shí)不僅僅是要多寫稼稿,還要多總結(jié)。