安卓(Android)實(shí)現(xiàn)選擇時(shí)間功能
前言
由于大部分android初級(jí)教程都沒(méi)教怎么選擇時(shí)間,初學(xué)者碰到這種難免會(huì)有些不知所措,難道要讓用戶自己輸入日期時(shí)間?先不說(shuō)用戶體驗(yàn)不好,處理用戶輸入各式各樣的日期格式也要花好大一番功夫,下面看看如何實(shí)現(xiàn)android選擇時(shí)間的功能。
android 6.0 中的運(yùn)行效果
TimePickerDialog和DatePickerDialog介紹
系統(tǒng)封裝好了兩個(gè)類可以供我們直接調(diào)用,TimepickerDialog
用于選擇時(shí)間,DatePickerDialog
用于選擇日期。
TimePikckerDialog的構(gòu)造方法
public TimePickerDialog(Context context, OnTimeSetListener listener, int hourOfDay, int minute, boolean is24HourView)
1、第一個(gè)參數(shù)接受一個(gè)context信息
2、第二個(gè)參數(shù)為當(dāng)選擇時(shí)間完成后執(zhí)行的回調(diào)接口
3、第三個(gè)參數(shù)和第四個(gè)參數(shù)為初始化的時(shí)間
4、第四個(gè)參數(shù)選擇true代表24小時(shí)制,false代表12小時(shí)制
DatePickerDialog構(gòu)造方法
public DatePickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth)
1、第一個(gè)參數(shù)接受context信息
2、第二個(gè)參數(shù)為日期選擇完成后的回掉接口
3、最后三個(gè)參數(shù)分別為初始化的年月日
可以看出兩者的構(gòu)造方法基本相差不多,由于兩者都是繼承自AlertDialog
,所以得到兩者對(duì)象后只要調(diào)用它們的show()
方法即可將選擇框彈出。
具體實(shí)現(xiàn)
有兩種實(shí)現(xiàn)方式,一種是直接在Activity
中使用,還有一種是通過(guò)FragmentDialog
使用。
直接在Activity中使用比較簡(jiǎn)單,不過(guò)代碼會(huì)比較亂,通過(guò)FragmentDialog管理的使用方式會(huì)比較優(yōu)雅,而且便于管理。
直接在Activity中使用
布局文件,里面就一個(gè)TextView用于顯示所選時(shí)間
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.testdemo.TestActivity"> <TextView android:layout_centerInParent="true" android:textSize="20sp" android:id="@+id/time_text" android:text="點(diǎn)此選擇時(shí)間" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>
Activity文件:
public class TestActivity extends AppCompatActivity { private TextView timeText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); timeText = (TextView) findViewById(R.id.time_text); //為TextView設(shè)置點(diǎn)擊事件 timeText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //將timeText傳入用于顯示所選擇的時(shí)間 showDialogPick((TextView) v); } }); } //將兩個(gè)選擇時(shí)間的dialog放在該函數(shù)中 private void showDialogPick(final TextView timeText) { final StringBuffer time = new StringBuffer(); //獲取Calendar對(duì)象,用于獲取當(dāng)前時(shí)間 final Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH); int day = calendar.get(Calendar.DAY_OF_MONTH); int hour = calendar.get(Calendar.HOUR_OF_DAY); int minute = calendar.get(Calendar.MINUTE); //實(shí)例化TimePickerDialog對(duì)象 final TimePickerDialog timePickerDialog = new TimePickerDialog(TestActivity.this, new TimePickerDialog.OnTimeSetListener() { //選擇完時(shí)間后會(huì)調(diào)用該回調(diào)函數(shù) @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { time.append(" " + hourOfDay + ":" + minute); //設(shè)置TextView顯示最終選擇的時(shí)間 timeText.setText(time); } }, hour, minute, true); //實(shí)例化DatePickerDialog對(duì)象 DatePickerDialog datePickerDialog = new DatePickerDialog(TestActivity.this, new DatePickerDialog.OnDateSetListener() { //選擇完日期后會(huì)調(diào)用該回調(diào)函數(shù) @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { //因?yàn)閙onthOfYear會(huì)比實(shí)際月份少一月所以這邊要加1 time.append(year + "-" + (monthOfYear+1) + "-" + dayOfMonth); //選擇完日期后彈出選擇時(shí)間對(duì)話框 timePickerDialog.show(); } }, year, month, day); //彈出選擇日期對(duì)話框 datePickerDialog.show(); } }
到此,點(diǎn)擊運(yùn)行就可以看效果了:)
通過(guò)FragmentDialog使用
為什么要用DialogFragment
1、用DialogFragment管理對(duì)話框是官方推介的使用方式。
2、使用DialogFragment管理對(duì)話框也方便代碼的重用。
通過(guò)FragmentDialog實(shí)現(xiàn)步驟
DatePickerFragment類:
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener{ private String date; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { //得到Calendar類實(shí)例,用于獲取當(dāng)前時(shí)間 Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH); int day = calendar.get(Calendar.DAY_OF_MONTH); //返回DatePickerDialog對(duì)象 //因?yàn)閷?shí)現(xiàn)了OnDateSetListener接口,所以第二個(gè)參數(shù)直接傳入this return new DatePickerDialog(getActivity(), this, year, month, day); } //實(shí)現(xiàn)OnDateSetListener接口的onDateSet()方法 @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { //這樣子寫就將選擇時(shí)間的fragment和選擇日期的fragment完全綁定在一起 //使用的時(shí)候只需直接調(diào)用DatePickerFragment的show()方法 //即可選擇完日期后選擇時(shí)間 TimePickerFragment timePicker = new TimePickerFragment(); timePicker.show(getFragmentManager(), "time_picker"); //將用戶選擇的日期傳到TimePickerFragment date = year + "年" + (monthOfYear+1) + "月" + dayOfMonth + "日"; timePicker.setTime(date); } }
TimePickerFragment類:
//實(shí)現(xiàn)OnTimeSetListener接口 public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener{ private String time = ""; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { //新建日歷類用于獲取當(dāng)前時(shí)間 Calendar calendar = Calendar.getInstance(); int hour = calendar.get(Calendar.HOUR_OF_DAY); int minute = calendar.get(Calendar.MINUTE); //返回TimePickerDialog對(duì)象 //因?yàn)閷?shí)現(xiàn)了OnTimeSetListener接口,所以第二個(gè)參數(shù)直接傳入this return new TimePickerDialog(getActivity(), this, hour, minute, true); } //實(shí)現(xiàn)OnTimeSetListener的onTimeSet方法 @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { //判斷activity是否是DataCallBack的一個(gè)實(shí)例 if(getActivity() instanceof DataCallBack){ //將activity強(qiáng)轉(zhuǎn)為DataCallBack DataCallBack dataCallBack = (DataCallBack) getActivity(); time = time + hourOfDay + "點(diǎn)" + minute + "分"; //調(diào)用activity的getData方法將數(shù)據(jù)傳回activity顯示 dataCallBack.getData(time); } } public void setTime(String date){ time += date; } }
Activity的布局文件,只有一個(gè)TextView用于顯示時(shí)間
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.testdemo.TestActivityActivity"> <TextView android:id="@+id/time_text" android:layout_centerInParent="true" android:text="點(diǎn)此選擇時(shí)間" android:textSize="20sp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>
Activity文件:
//實(shí)現(xiàn)DataCallBack接口,實(shí)現(xiàn)與Fragment的通信 public class TestActivityActivity extends AppCompatActivity implements DataCallBack{ TextView timeText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test2); timeText = (TextView) findViewById(R.id.time_text); //為timeText設(shè)置點(diǎn)擊事件 timeText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //實(shí)例化對(duì)象 DatePickerFragment datePickerFragment = new DatePickerFragment(); //調(diào)用show方法彈出對(duì)話框 // 第一個(gè)參數(shù)為FragmentManager對(duì)象 // 第二個(gè)為調(diào)用該方法的fragment的標(biāo)簽 datePickerFragment.show(getFragmentManager(), "date_picker"); } }); } //實(shí)現(xiàn)DataCallBack的getData方法 @Override public void getData(String data) { //data即為fragment調(diào)用該函數(shù)傳回的日期時(shí)間 timeText.setText(data); } }
由于TimePickerFragment
對(duì)話框是在DatePickerFragment
類里面啟動(dòng)的,所以這樣寫只能日期和時(shí)間都選擇,如果要單獨(dú)選擇日期或者時(shí)間,只需要重寫onTimeSet()
或者onDateSet()
方法即可
兼容性問(wèn)題
不同的android版本顯示的效果不同,在android6.0效果很好,不過(guò)在一些低版本android(如4.0,筆者沒(méi)有每個(gè)版本都測(cè)試)會(huì)出現(xiàn)調(diào)用兩次回掉函數(shù)的情況,導(dǎo)致選擇兩次時(shí)間。解決的辦法有很多,只要保證回調(diào)函數(shù)里面的邏輯只執(zhí)行一次就可以。這里提供一種比較通用的方法。
重寫TimePickerDialog
和DatePickerDialog
的onStop()
方法
直接在Activity中使用的重寫方法
final TimePickerDialog timePickerDialog = new TimePickerDialog(TestActivity.this, new TimePickerDialog.OnTimeSetListener() { //選擇完時(shí)間后會(huì)調(diào)用該回調(diào)函數(shù) @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { time.append(" " + hourOfDay + ":" + minute); //設(shè)置TextView顯示最終選擇的時(shí)間 timeText.setText(time); } }, hour, minute, true){ // 重寫onStop() @Override protected void onStop() { } }; //實(shí)例化DatePickerDialog對(duì)象 DatePickerDialog datePickerDialog = new DatePickerDialog(TestActivity.this, new DatePickerDialog.OnDateSetListener() { //選擇完日期后會(huì)調(diào)用該回調(diào)函數(shù) @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { //因?yàn)閙onthOfYear會(huì)比實(shí)際月份少一月所以這邊要加1 time.append(year + "-" + (monthOfYear+1) + "-" + dayOfMonth); //選擇完日期后彈出選擇時(shí)間對(duì)話框 timePickerDialog.show(); } }, year, month, day){ //重寫onstop @Override protected void onStop() { } };
上面的寫法看起來(lái)會(huì)比較亂,也可以另外新建一個(gè)類繼承TimePickerDialog
或者DatePickerDialog
然后重寫onStop()
方法
通過(guò)FragmentDialog
使用的重寫方式
只需在onCreateDialog()
方法里面重寫即可,下面的代碼會(huì)比較清晰
return new DatePickerDialog(getActivity(), this, year, month, day){ // 重寫onStop @Override protected void onStop() { } };
return new TimePickerDialog(getActivity(), this, hour, minute, true){ //重寫onStop @Override protected void onStop() { } };
總結(jié)
筆者水平有限,但是保證以上代碼都是親手實(shí)現(xiàn)過(guò)一遍的。如果有什么不足之處歡迎大家指出,以上就是本文的全部?jī)?nèi)容,希望對(duì)大家開發(fā)Android能有所幫助。
- 輕松實(shí)現(xiàn)可擴(kuò)展自定義的Android滾輪時(shí)間選擇控件
- Android時(shí)間選擇器、日期選擇器實(shí)現(xiàn)代碼
- Android中TimePicker與DatePicker時(shí)間日期選擇組件的使用實(shí)例
- Android之日期及時(shí)間選擇對(duì)話框用法實(shí)例分析
- 解析android中系統(tǒng)日期時(shí)間的獲取
- android計(jì)時(shí)器,時(shí)間計(jì)算器的實(shí)現(xiàn)方法
- android獲取時(shí)間差的方法
- android 默認(rèn)時(shí)間格式修改方法
- Android調(diào)用系統(tǒng)時(shí)間格式顯示時(shí)間信息
相關(guān)文章
Android編程設(shè)計(jì)模式之迭代器模式詳解
這篇文章主要介紹了Android編程設(shè)計(jì)模式之迭代器模式,結(jié)合實(shí)例形式詳細(xì)分析了Android迭代器模式的概念、原理、應(yīng)用場(chǎng)景、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2017-12-12Android斷點(diǎn)續(xù)傳下載器JarvisDownloader的示例
本篇文章主要介紹了Android斷點(diǎn)續(xù)傳下載器JarvisDownloader的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Android使用View Animation實(shí)現(xiàn)動(dòng)畫加載界面
這篇文章主要為大家詳細(xì)介紹了Android使用View Animation實(shí)現(xiàn)動(dòng)畫加載界面的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04Android SQLite數(shù)據(jù)庫(kù)增刪改查操作的使用詳解
本篇文章介紹了,在Android中SQLite數(shù)據(jù)庫(kù)增刪改查操作的使用詳解。需要的朋友參考下2013-04-04Android使用kotlin實(shí)現(xiàn)多行文本上下滾動(dòng)播放
這篇文章主要為大家詳細(xì)介紹了Android使用kotlin實(shí)現(xiàn)多行文本的上下滾動(dòng)播放,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Android 使用AsyncTask實(shí)現(xiàn)多任務(wù)多線程斷點(diǎn)續(xù)傳下載
這篇文章主要介紹了Android 使用AsyncTask實(shí)現(xiàn)多任務(wù)多線程斷點(diǎn)續(xù)傳下載的相關(guān)資料,需要的朋友可以參考下2018-05-05Android上傳多張圖片的實(shí)例代碼(RxJava異步分發(fā))
本篇文章主要介紹了Android上傳多張圖片的實(shí)例代碼(RxJava異步分發(fā)),具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08