網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
Android開(kāi)發(fā)實(shí)現(xiàn)日期時(shí)間控件選擇_Android
作者:informationchina ? 更新時(shí)間: 2022-11-10 編程語(yǔ)言本文實(shí)例為大家分享了Android開(kāi)發(fā)實(shí)現(xiàn)日期時(shí)間控件選擇的具體代碼,供大家參考,具體內(nèi)容如下
前言
整合Android原生控件(日期控件DatePicker、時(shí)間控件TimePicker)實(shí)現(xiàn)選擇日期、時(shí)間綁定。
本文僅僅是一種參考,不光是時(shí)間控件,自定義的Layout一樣可以采用這種方式。
涉及技術(shù)要點(diǎn):
1.控件事件綁定
2.彈出框AlertDialog
3.日期格式化SimpleDateFormat
一、創(chuàng)建彈出Layout
1.1 新建Layout,修改樣式為L(zhǎng)inearLayout
<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中添加日期和時(shí)間控件
注意需要將控件的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類(lèi)是為了將方法封裝,以便我項(xiàng)目多次調(diào)用
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ù)傳入方法中,方便我們動(dòng)態(tài)加載Layout和指定AlertDialog彈出所在的Activity,避免彈出框無(wú)法顯示。
textView參數(shù)為需要綁定選擇的控件,并且在選擇之后,會(huì)將選擇的日期返回給textView
titile是可選參數(shù),指定彈出框的標(biāo)題,不指定的話(huà),會(huì)默認(rèn)為“選擇日期”
2.1.2 SetDateDialog中綁定textView的click事件
給textView綁定事件后,在用戶(hù)點(diǎn)擊控件時(shí)即可執(zhí)行相應(yīng)的事件內(nèi)容,在此我們需要的是用戶(hù)點(diǎn)擊控件時(shí),彈出日期選擇框。
textView.setOnClickListener(view -> {
?? ?AlertDialog.Builder builder = new AlertDialog.Builder(activity);
?? ?builder.setView(view1);
?? ?builder.create().show();
});
由于我們的控件中含有時(shí)間控件,需要隱藏
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有默認(rèn)值,則在彈出的時(shí)候需要將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);
設(shè)置彈出框的標(biāo)題
if (title != null && title.length > 0) {
? ? ? ? ? ? ? ? builder.setTitle(title[0]);
? ? ? ? ? ? } else
? ? ? ? ? ? ? ? builder.setTitle("選擇日期");
實(shí)現(xiàn)彈出框的按鈕事件:
點(diǎn)擊確定時(shí),綁定值給textView,并關(guān)閉彈窗;點(diǎn)擊取消時(shí),直接關(guān)閉天窗;點(diǎn)擊現(xiàn)在時(shí),將當(dāng)前時(shí)間傳給textView,并關(guān)閉彈窗。
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
? ? ? ? ? ? ? ? //獲取當(dāng)前時(shí)間
? ? ? ? ? ? ? ? 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);
? ? ? ? ? ? //設(shè)置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
? ? ? ? ? ? ? ? //獲取當(dāng)前時(shí)間
? ? ? ? ? ? ? ? Date date = new Date(System.currentTimeMillis());
? ? ? ? ? ? ? ? textView.setText(simpleDateFormat.format(date));
? ? ? ? ? ? ? ? dialog.cancel();
? ? ? ? ? ? });
? ? ? ? ? ? builder.create().show();
? ? ? ? });
? ? }
同樣的方式我們?cè)賹?shí)現(xiàn)選擇日期時(shí)間的方法,具體不再贅述,上代碼:
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));
? ? ? ? ? ? //設(shè)置Date布局
? ? ? ? ? ? builder.setView(view1);
? ? ? ? ? ? if (title != null && title.length > 0) {
? ? ? ? ? ? ? ? builder.setTitle(title[0]);
? ? ? ? ? ? } else
? ? ? ? ? ? ? ? builder.setTitle("選擇時(shí)間");
? ? ? ? ? ? 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
? ? ? ? ? ? ? ? //獲取當(dāng)前時(shí)間
? ? ? ? ? ? ? ? Date date = new Date(System.currentTimeMillis());
? ? ? ? ? ? ? ? textView.setText(simpleDateFormat.format(date));
? ? ? ? ? ? ? ? dialog.cancel();
? ? ? ? ? ? });
? ? ? ? ? ? builder.create().show();
? ? ? ? });
? ? }
文中提到的convertDateToCalendar是筆者用于日期轉(zhuǎn)換的,您可以根據(jù)自己的需要去靈活實(shí)現(xiàn)
private static Calendar convertDateToCalendar(String strDate) {
? ? ? ? int year;
? ? ? ? int month;
? ? ? ? int day;
? ? ? ? int hour;
? ? ? ? int minute;
? ? ? ? Calendar calendar = Calendar.getInstance();
? ? ? ? //獲取當(dāng)前時(shí)間
? ? ? ? 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;
? ? }
至此已經(jīng)大功告成,下面看下如何引用
2.2 引用
在任意需要用到選擇時(shí)間的Activity的onCreate方法中添加下面一句代碼即可:
DateTimeDialog.SetDateDialog(getApplicationContext(), MainActivity.this, timeSelectView, "請(qǐng)選擇日期");
將其中的MainActivity修改為您當(dāng)前的Activity;將timeSelectView 修改為您頁(yè)面中的時(shí)間TextView或者EditView,“請(qǐng)選擇日期”為可選參數(shù),可忽略。
三. 總結(jié)
本文僅僅為了使用方便而對(duì)AlertDialog進(jìn)行了封裝,用的是Android的原生控件,寫(xiě)在此處僅僅給新入門(mén)的朋友們以參考。
原文鏈接:https://blog.csdn.net/informationchina/article/details/125065813
相關(guān)推薦
- 2022-04-10 新版Microsoft Edge關(guān)閉平滑滾動(dòng),類(lèi)似chrome效果
- 2022-05-07 Qt+OpenCV實(shí)現(xiàn)目標(biāo)檢測(cè)詳解_C 語(yǔ)言
- 2022-10-23 Python?Pandas數(shù)據(jù)合并pd.merge用法詳解_python
- 2022-11-24 Clickhouse系列之整合Hive數(shù)據(jù)倉(cāng)庫(kù)示例詳解_數(shù)據(jù)庫(kù)其它
- 2022-11-18 React網(wǎng)絡(luò)請(qǐng)求發(fā)起方法詳細(xì)介紹_React
- 2022-09-19 python正則表達(dá)式re.sub各個(gè)參數(shù)的超詳細(xì)講解_python
- 2022-05-06 Python?ORM框架之SQLAlchemy?的基礎(chǔ)用法_python
- 2022-07-06 Python?Pyecharts繪制桑基圖分析用戶(hù)行為路徑_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支