Android開發(fā)實現(xiàn)日期時間控件選擇
本文實例為大家分享了Android開發(fā)實現(xiàn)日期時間控件選擇的具體代碼,供大家參考,具體內容如下
前言
整合Android原生控件(日期控件DatePicker、時間控件TimePicker)實現(xiàn)選擇日期、時間綁定。
本文僅僅是一種參考,不光是時間控件,自定義的Layout一樣可以采用這種方式。
涉及技術要點:
1.控件事件綁定
2.彈出框AlertDialog
3.日期格式化SimpleDateFormat
一、創(chuàng)建彈出Layout
1.1 新建Layout,修改樣式為LinearLayout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ? ? android:layout_width="match_parent" ? ? android:layout_height="wrap_content" ? ? android:orientation="vertical"> </LinearLayout>
1.2 Layout中添加日期和時間控件
注意需要將控件的calendarViewShown指定為false及datePickerMode屬性指定為spinner
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ? ? android:layout_width="match_parent" ? ? android:layout_height="wrap_content" ? ? android:orientation="vertical"> ? ? <DatePicker ? ? ? ? android:id="@+id/dialog_datetime_date_picker" ? ? ? ? android:layout_width="match_parent" ? ? ? ? android:layout_height="wrap_content" ? ? ? ? android:calendarViewShown="false" ? ? ? ? android:datePickerMode="spinner"/> ? ? <TimePicker ? ? ? ? android:id="@+id/dialog_datetime_time_picker" ? ? ? ? android:layout_width="match_parent" ? ? ? ? android:layout_height="wrap_content" ? ? ? ? android:calendarViewShown="false" ? ? ? ? android:datePickerMode="spinner" /> </LinearLayout>
二、新建DateTimeDialog
創(chuàng)建DateTimeDialog類是為了將方法封裝,以便我項目多次調用
public class DateTimeDialog { }
2.1 創(chuàng)建靜態(tài)方法
2.1.1 創(chuàng)建SetDateDialog,用于選擇日期
public static void SetDateDialog(Context context, Activity activity, TextView textView, String... title) { }
這里我們將引用控件的context、activity作為參數(shù)傳入方法中,方便我們動態(tài)加載Layout和指定AlertDialog彈出所在的Activity,避免彈出框無法顯示。
textView參數(shù)為需要綁定選擇的控件,并且在選擇之后,會將選擇的日期返回給textView
titile是可選參數(shù),指定彈出框的標題,不指定的話,會默認為“選擇日期”
2.1.2 SetDateDialog中綁定textView的click事件
給textView綁定事件后,在用戶點擊控件時即可執(zhí)行相應的事件內容,在此我們需要的是用戶點擊控件時,彈出日期選擇框。
textView.setOnClickListener(view -> { ?? ?AlertDialog.Builder builder = new AlertDialog.Builder(activity); ?? ?builder.setView(view1); ?? ?builder.create().show(); });
由于我們的控件中含有時間控件,需要隱藏
View view1 = LayoutInflater.from(context).inflate(R.layout.dialog_datetime, null); ? final TimePicker timePicker = view1.findViewById(R.id.dialog_datetime_time_picker); ? ? ? ? ? ? ? ? ? ? ? ? timePicker.setVisibility(View.GONE);
如果textView有默認值,則在彈出的時候需要將textView的日期帶入彈出框中
final DatePicker datePicker = view1.findViewById(R.id.dialog_datetime_date_picker); ? ? ? ? ? ? Calendar calendar; ? ? ? ? ? ? String strDate = textView.getText().toString(); ? ? ? ? ? ? calendar = convertDateToCalendar(strDate); ? ? ? ? ? ? datePicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE), null);
設置彈出框的標題
if (title != null && title.length > 0) { ? ? ? ? ? ? ? ? builder.setTitle(title[0]); ? ? ? ? ? ? } else ? ? ? ? ? ? ? ? builder.setTitle("選擇日期");
實現(xiàn)彈出框的按鈕事件:
點擊確定時,綁定值給textView,并關閉彈窗;點擊取消時,直接關閉天窗;點擊現(xiàn)在時,將當前時間傳給textView,并關閉彈窗。
builder.setPositiveButton("確 定", (dialog, i) -> { ? ? ? ? ? ? ? ? //日期格式 ? ? ? ? ? ? ? ? int year = datePicker.getYear(); ? ? ? ? ? ? ? ? int month = datePicker.getMonth() + 1; ? ? ? ? ? ? ? ? int dayOfMonth = datePicker.getDayOfMonth(); ? ? ? ? ? ? ? ? textView.setText(String.format(Locale.getDefault(), "%d年%d月%d日 ", year, month, dayOfMonth)); ? ? ? ? ? ? ? ? dialog.cancel(); ? ? ? ? ? ? }); ? ? ? ? ? ? builder.setNegativeButton("取 消", (dialog, which) -> dialog.cancel()); ? ? ? ? ? ? builder.setNeutralButton("現(xiàn) 在", (dialog, i) -> { ? ? ? ? ? ? ? ? SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年M月d日",Locale.getDefault());// HH:mm:ss ? ? ? ? ? ? ? ? //獲取當前時間 ? ? ? ? ? ? ? ? Date date = new Date(System.currentTimeMillis()); ? ? ? ? ? ? ? ? textView.setText(simpleDateFormat.format(date)); ? ? ? ? ? ? ? ? dialog.cancel(); ? ? ? ? ? ? });
以下是完整代碼:
public static void SetDateDialog(Context context, Activity activity, TextView textView, String... title) { ? ? ? ? textView.setOnClickListener(view -> { ? ? ? ? ? ? AlertDialog.Builder builder = new AlertDialog.Builder(activity); ? ? ? ? ? ? View view1 = LayoutInflater.from(context).inflate(R.layout.dialog_datetime, null); ? ? ? ? ? ? final DatePicker datePicker = view1.findViewById(R.id.dialog_datetime_date_picker); ? ? ? ? ? ? final TimePicker timePicker = view1.findViewById(R.id.dialog_datetime_time_picker); ? ? ? ? ? ? timePicker.setIs24HourView(true); ? ? ? ? ? ? Calendar calendar; ? ? ? ? ? ? String strDate = textView.getText().toString(); ? ? ? ? ? ? calendar = convertDateToCalendar(strDate); ? ? ? ? ? ? datePicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE), null); ? ? ? ? ? ? timePicker.setHour(calendar.get(Calendar.HOUR_OF_DAY)); ? ? ? ? ? ? timePicker.setMinute(calendar.get(Calendar.MINUTE)); ? ? ? ? ? ? timePicker.setVisibility(View.GONE); // ? ? ? ? ? ?datePicker.setCalendarViewShown(false); ? ? ? ? ? ? //設置Date布局 ? ? ? ? ? ? builder.setView(view1); ? ? ? ? ? ? if (title != null && title.length > 0) { ? ? ? ? ? ? ? ? builder.setTitle(title[0]); ? ? ? ? ? ? } else ? ? ? ? ? ? ? ? builder.setTitle("選擇日期"); ? ? ? ? ? ? builder.setPositiveButton("確 定", (dialog, i) -> { ? ? ? ? ? ? ? ? //日期格式 ? ? ? ? ? ? ? ? int year = datePicker.getYear(); ? ? ? ? ? ? ? ? int month = datePicker.getMonth() + 1; ? ? ? ? ? ? ? ? int dayOfMonth = datePicker.getDayOfMonth(); ? ? ? ? ? ? ? ? textView.setText(String.format(Locale.getDefault(), "%d年%d月%d日 ", year, month, dayOfMonth)); ? ? ? ? ? ? ? ? dialog.cancel(); ? ? ? ? ? ? }); ? ? ? ? ? ? builder.setNegativeButton("取 消", (dialog, which) -> dialog.cancel()); ? ? ? ? ? ? builder.setNeutralButton("現(xiàn) 在", (dialog, i) -> { ? ? ? ? ? ? ? ? SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年M月d日",Locale.getDefault());// HH:mm:ss ? ? ? ? ? ? ? ? //獲取當前時間 ? ? ? ? ? ? ? ? Date date = new Date(System.currentTimeMillis()); ? ? ? ? ? ? ? ? textView.setText(simpleDateFormat.format(date)); ? ? ? ? ? ? ? ? dialog.cancel(); ? ? ? ? ? ? }); ? ? ? ? ? ? builder.create().show(); ? ? ? ? }); ? ? }
同樣的方式我們再實現(xiàn)選擇日期時間的方法,具體不再贅述,上代碼:
public static void SetDateTimeDialog(Context context, Activity activity, TextView textView, String... title) { ? ? ? ? textView.setOnClickListener(view -> { ? ? ? ? ? ? AlertDialog.Builder builder = new AlertDialog.Builder(activity); ? ? ? ? ? ? View view1 = LayoutInflater.from(context).inflate(R.layout.dialog_datetime, null); ? ? ? ? ? ? final DatePicker datePicker = view1.findViewById(R.id.dialog_datetime_date_picker); ? ? ? ? ? ? final TimePicker timePicker = view1.findViewById(R.id.dialog_datetime_time_picker); ? ? ? ? ? ? timePicker.setIs24HourView(true); // ? ? ? ? ? ?datePicker.setCalendarViewShown(false); ? ? ? ? ? ? Calendar calendar; ? ? ? ? ? ? String strDate = textView.getText().toString(); ? ? ? ? ? ? calendar = convertDateToCalendar(strDate); ? ? ? ? ? ? datePicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE), null); ? ? ? ? ? ? timePicker.setHour(calendar.get(Calendar.HOUR_OF_DAY)); ? ? ? ? ? ? timePicker.setMinute(calendar.get(Calendar.MINUTE)); ? ? ? ? ? ? //設置Date布局 ? ? ? ? ? ? builder.setView(view1); ? ? ? ? ? ? if (title != null && title.length > 0) { ? ? ? ? ? ? ? ? builder.setTitle(title[0]); ? ? ? ? ? ? } else ? ? ? ? ? ? ? ? builder.setTitle("選擇時間"); ? ? ? ? ? ? builder.setPositiveButton("確 定", (dialog, i) -> { ? ? ? ? ? ? ? ? //日期格式 ? ? ? ? ? ? ? ? int year = datePicker.getYear(); ? ? ? ? ? ? ? ? int month = datePicker.getMonth() + 1; ? ? ? ? ? ? ? ? int dayOfMonth = datePicker.getDayOfMonth(); ? ? ? ? ? ? ? ? int hour = timePicker.getHour(); ? ? ? ? ? ? ? ? int min = timePicker.getMinute(); // ? ? ? ? ? ? ? ? ? ?timePicker.getSecond(); ? ? ? ? ? ? ? ? textView.setText(String.format(Locale.getDefault(), "%d年%d月%d日 %d:%d", year, month, dayOfMonth, hour, min)); ? ? ? ? ? ? ? ? dialog.cancel(); ? ? ? ? ? ? }); ? ? ? ? ? ? builder.setNegativeButton("取 消", (dialog, which) -> dialog.cancel()); ? ? ? ? ? ? builder.setNeutralButton("現(xiàn) 在", (dialog, i) -> { ? ? ? ? ? ? ? ? SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年M月d日 HH:mm", Locale.getDefault());// HH:mm:ss ? ? ? ? ? ? ? ? //獲取當前時間 ? ? ? ? ? ? ? ? Date date = new Date(System.currentTimeMillis()); ? ? ? ? ? ? ? ? textView.setText(simpleDateFormat.format(date)); ? ? ? ? ? ? ? ? dialog.cancel(); ? ? ? ? ? ? }); ? ? ? ? ? ? builder.create().show(); ? ? ? ? }); ? ? }
文中提到的convertDateToCalendar是筆者用于日期轉換的,您可以根據(jù)自己的需要去靈活實現(xiàn)
private static Calendar convertDateToCalendar(String strDate) { ? ? ? ? int year; ? ? ? ? int month; ? ? ? ? int day; ? ? ? ? int hour; ? ? ? ? int minute; ? ? ? ? Calendar calendar = Calendar.getInstance(); ? ? ? ? //獲取當前時間 ? ? ? ? Date date = new Date(System.currentTimeMillis()); ? ? ? ? calendar.setTime(date); // ? ? ? ?calendar.add(Calendar.MONTH,1); ? ? ? ? year = calendar.get(Calendar.YEAR); ? ? ? ? month = calendar.get(Calendar.MONTH); ? ? ? ? day = calendar.get(Calendar.DATE); ? ? ? ? hour = calendar.get(Calendar.HOUR_OF_DAY); ? ? ? ? minute = calendar.get(Calendar.MINUTE); ? ? ? ? if (strDate != null && !strDate.equals("")) { ? ? ? ? ? ? if (strDate.contains(":")) { ? ? ? ? ? ? ? ? strDate = strDate.split(":")[1]; ? ? ? ? ? ? } ? ? ? ? ? ? strDate = strDate.replace("年", "-").replace("月", "-").replace("日", "").replace(".", "").replace(" ", "-").replace(":", "-"); ? ? ? ? ? ? Log.d("liuwz", "convertDateToCalendar: "+strDate); ? ? ? ? ? ? if (strDate.split("-").length >= 3) { ? ? ? ? ? ? ? ? year = Integer.parseInt(strDate.split("-")[0]); ? ? ? ? ? ? ? ? month = Integer.parseInt(strDate.split("-")[1]); ? ? ? ? ? ? ? ? day = Integer.parseInt(strDate.split("-")[2]); ? ? ? ? ? ? ? ? if (strDate.split("-").length >= 5) { ? ? ? ? ? ? ? ? ? ? hour = Integer.parseInt(strDate.split("-")[3]); ? ? ? ? ? ? ? ? ? ? minute = Integer.parseInt(strDate.split("-")[4]); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? calendar.set(year, month, day, hour, minute); ? ? ? ? ? ? ? ? calendar.add(Calendar.MONTH, -1); ? ? ? ? ? ? } else if (strDate.split("-").length >= 2) { ? ? ? ? ? ? ? ? hour = Integer.parseInt(strDate.split("-")[0]); ? ? ? ? ? ? ? ? minute = Integer.parseInt(strDate.split("-")[1]); ? ? ? ? ? ? ? ? calendar.set(year, month, day, hour, minute); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? return calendar; ? ? }
至此已經大功告成,下面看下如何引用
2.2 引用
在任意需要用到選擇時間的Activity的onCreate方法中添加下面一句代碼即可:
DateTimeDialog.SetDateDialog(getApplicationContext(), MainActivity.this, timeSelectView, "請選擇日期");
將其中的MainActivity修改為您當前的Activity;將timeSelectView 修改為您頁面中的時間TextView或者EditView,“請選擇日期”為可選參數(shù),可忽略。
三. 總結
本文僅僅為了使用方便而對AlertDialog進行了封裝,用的是Android的原生控件,寫在此處僅僅給新入門的朋友們以參考。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Android 中使用 AsyncTask 異步讀取網絡圖片
這篇文章主要介紹了Android 中使用 AsyncTask 異步讀取網絡圖片的相關資料,需要的朋友可以參考下2016-02-02Android?中的?Timer?和?TimerTask詳解
Timer?是?Java?中用于創(chuàng)建定時任務的類,它位于?java.util?包中,可以使用Timer來安排一次性或定期執(zhí)行的任務,這篇文章主要介紹了Android?的?Timer?和?TimerTask,需要的朋友可以參考下2024-05-05Android實現(xiàn)類似網易新聞選項卡動態(tài)滑動效果
這篇文章主要介紹了Android實現(xiàn)類似網易新聞選項卡動態(tài)滑動效果的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-11-11Android?自定義view中根據(jù)狀態(tài)修改drawable圖片
這篇文章主要介紹了Android?自定義view中根據(jù)狀態(tài)修改drawable圖片的相關資料,需要的朋友可以參考下2023-07-07