安卓(Android)實現(xiàn)選擇時間功能
前言
由于大部分android初級教程都沒教怎么選擇時間,初學(xué)者碰到這種難免會有些不知所措,難道要讓用戶自己輸入日期時間?先不說用戶體驗不好,處理用戶輸入各式各樣的日期格式也要花好大一番功夫,下面看看如何實現(xiàn)android選擇時間的功能。
android 6.0 中的運行效果


TimePickerDialog和DatePickerDialog介紹
系統(tǒng)封裝好了兩個類可以供我們直接調(diào)用,TimepickerDialog用于選擇時間,DatePickerDialog用于選擇日期。
TimePikckerDialog的構(gòu)造方法
public TimePickerDialog(Context context, OnTimeSetListener listener, int hourOfDay, int minute, boolean is24HourView)
1、第一個參數(shù)接受一個context信息
2、第二個參數(shù)為當(dāng)選擇時間完成后執(zhí)行的回調(diào)接口
3、第三個參數(shù)和第四個參數(shù)為初始化的時間
4、第四個參數(shù)選擇true代表24小時制,false代表12小時制
DatePickerDialog構(gòu)造方法
public DatePickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth)
1、第一個參數(shù)接受context信息
2、第二個參數(shù)為日期選擇完成后的回掉接口
3、最后三個參數(shù)分別為初始化的年月日
可以看出兩者的構(gòu)造方法基本相差不多,由于兩者都是繼承自AlertDialog,所以得到兩者對象后只要調(diào)用它們的show()方法即可將選擇框彈出。
具體實現(xiàn)
有兩種實現(xiàn)方式,一種是直接在Activity中使用,還有一種是通過FragmentDialog使用。
直接在Activity中使用比較簡單,不過代碼會比較亂,通過FragmentDialog管理的使用方式會比較優(yōu)雅,而且便于管理。
直接在Activity中使用
布局文件,里面就一個TextView用于顯示所選時間
<?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="點此選擇時間"
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è)置點擊事件
timeText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//將timeText傳入用于顯示所選擇的時間
showDialogPick((TextView) v);
}
});
}
//將兩個選擇時間的dialog放在該函數(shù)中
private void showDialogPick(final TextView timeText) {
final StringBuffer time = new StringBuffer();
//獲取Calendar對象,用于獲取當(dāng)前時間
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);
//實例化TimePickerDialog對象
final TimePickerDialog timePickerDialog = new TimePickerDialog(TestActivity.this, new TimePickerDialog.OnTimeSetListener() {
//選擇完時間后會調(diào)用該回調(diào)函數(shù)
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
time.append(" " + hourOfDay + ":" + minute);
//設(shè)置TextView顯示最終選擇的時間
timeText.setText(time);
}
}, hour, minute, true);
//實例化DatePickerDialog對象
DatePickerDialog datePickerDialog = new DatePickerDialog(TestActivity.this, new DatePickerDialog.OnDateSetListener() {
//選擇完日期后會調(diào)用該回調(diào)函數(shù)
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//因為monthOfYear會比實際月份少一月所以這邊要加1
time.append(year + "-" + (monthOfYear+1) + "-" + dayOfMonth);
//選擇完日期后彈出選擇時間對話框
timePickerDialog.show();
}
}, year, month, day);
//彈出選擇日期對話框
datePickerDialog.show();
}
}
到此,點擊運行就可以看效果了:)
通過FragmentDialog使用
為什么要用DialogFragment
1、用DialogFragment管理對話框是官方推介的使用方式。
2、使用DialogFragment管理對話框也方便代碼的重用。
通過FragmentDialog實現(xiàn)步驟
DatePickerFragment類:
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener{
private String date;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
//得到Calendar類實例,用于獲取當(dāng)前時間
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對象
//因為實現(xiàn)了OnDateSetListener接口,所以第二個參數(shù)直接傳入this
return new DatePickerDialog(getActivity(), this, year, month, day);
}
//實現(xiàn)OnDateSetListener接口的onDateSet()方法
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//這樣子寫就將選擇時間的fragment和選擇日期的fragment完全綁定在一起
//使用的時候只需直接調(diào)用DatePickerFragment的show()方法
//即可選擇完日期后選擇時間
TimePickerFragment timePicker = new TimePickerFragment();
timePicker.show(getFragmentManager(), "time_picker");
//將用戶選擇的日期傳到TimePickerFragment
date = year + "年" + (monthOfYear+1) + "月" + dayOfMonth + "日";
timePicker.setTime(date);
}
}
TimePickerFragment類:
//實現(xiàn)OnTimeSetListener接口
public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener{
private String time = "";
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
//新建日歷類用于獲取當(dāng)前時間
Calendar calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
//返回TimePickerDialog對象
//因為實現(xiàn)了OnTimeSetListener接口,所以第二個參數(shù)直接傳入this
return new TimePickerDialog(getActivity(), this, hour, minute, true);
}
//實現(xiàn)OnTimeSetListener的onTimeSet方法
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
//判斷activity是否是DataCallBack的一個實例
if(getActivity() instanceof DataCallBack){
//將activity強轉(zhuǎn)為DataCallBack
DataCallBack dataCallBack = (DataCallBack) getActivity();
time = time + hourOfDay + "點" + minute + "分";
//調(diào)用activity的getData方法將數(shù)據(jù)傳回activity顯示
dataCallBack.getData(time);
}
}
public void setTime(String date){
time += date;
}
}
Activity的布局文件,只有一個TextView用于顯示時間
<?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="點此選擇時間"
android:textSize="20sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
Activity文件:
//實現(xiàn)DataCallBack接口,實現(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è)置點擊事件
timeText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//實例化對象
DatePickerFragment datePickerFragment = new DatePickerFragment();
//調(diào)用show方法彈出對話框
// 第一個參數(shù)為FragmentManager對象
// 第二個為調(diào)用該方法的fragment的標(biāo)簽
datePickerFragment.show(getFragmentManager(), "date_picker");
}
});
}
//實現(xiàn)DataCallBack的getData方法
@Override
public void getData(String data) {
//data即為fragment調(diào)用該函數(shù)傳回的日期時間
timeText.setText(data);
}
}
由于TimePickerFragment對話框是在DatePickerFragment類里面啟動的,所以這樣寫只能日期和時間都選擇,如果要單獨選擇日期或者時間,只需要重寫onTimeSet()或者onDateSet()方法即可
兼容性問題
不同的android版本顯示的效果不同,在android6.0效果很好,不過在一些低版本android(如4.0,筆者沒有每個版本都測試)會出現(xiàn)調(diào)用兩次回掉函數(shù)的情況,導(dǎo)致選擇兩次時間。解決的辦法有很多,只要保證回調(diào)函數(shù)里面的邏輯只執(zhí)行一次就可以。這里提供一種比較通用的方法。
重寫TimePickerDialog和DatePickerDialog的onStop()方法
直接在Activity中使用的重寫方法
final TimePickerDialog timePickerDialog = new TimePickerDialog(TestActivity.this, new TimePickerDialog.OnTimeSetListener() {
//選擇完時間后會調(diào)用該回調(diào)函數(shù)
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
time.append(" " + hourOfDay + ":" + minute);
//設(shè)置TextView顯示最終選擇的時間
timeText.setText(time);
}
}, hour, minute, true){
// 重寫onStop()
@Override
protected void onStop() {
}
};
//實例化DatePickerDialog對象
DatePickerDialog datePickerDialog = new DatePickerDialog(TestActivity.this, new DatePickerDialog.OnDateSetListener() {
//選擇完日期后會調(diào)用該回調(diào)函數(shù)
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//因為monthOfYear會比實際月份少一月所以這邊要加1
time.append(year + "-" + (monthOfYear+1) + "-" + dayOfMonth);
//選擇完日期后彈出選擇時間對話框
timePickerDialog.show();
}
}, year, month, day){
//重寫onstop
@Override
protected void onStop() {
}
};
上面的寫法看起來會比較亂,也可以另外新建一個類繼承TimePickerDialog或者DatePickerDialog然后重寫onStop()方法
通過FragmentDialog使用的重寫方式
只需在onCreateDialog()方法里面重寫即可,下面的代碼會比較清晰
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é)
筆者水平有限,但是保證以上代碼都是親手實現(xiàn)過一遍的。如果有什么不足之處歡迎大家指出,以上就是本文的全部內(nèi)容,希望對大家開發(fā)Android能有所幫助。
相關(guān)文章
使用Compose制作抖音快手視頻進度條Loading動畫效果
這篇文章主要為大家介紹了使用Compose制作抖音快手視頻進度條Loading動畫效果,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08
Android中兩個Activity之間數(shù)據(jù)傳遞及返回問題
本篇文章主要介紹了Android中兩個Activity之間數(shù)據(jù)傳遞及返回問題,這里整理了詳細(xì)的代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-02-02
Android Studio 配置忽略文件的方法實現(xiàn)
這篇文章主要介紹了Android Studio 配置忽略文件的方法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Android usb設(shè)備權(quán)限查詢及自動獲取詳解流程
本篇文章介紹了我想要獲取Android系統(tǒng)usb設(shè)備使用權(quán)限時遇到的問題,以及解決該問題的過程及思路,通讀本篇對大家的學(xué)習(xí)或工作具有一定的價值,需要的朋友可以參考下2021-10-10
使用Android系統(tǒng)提供的DownloadManager來下載文件
本篇文章主要介紹了使用Android系統(tǒng)提供的DownloadManager來下載文件,可以將長時間的下載任務(wù)交給系統(tǒng),完全由系統(tǒng)管理,有需要的可以了解下。2016-11-11
android 調(diào)用JNI SO動態(tài)庫的方法
android 調(diào)用JNI 分為靜態(tài)調(diào)用與動態(tài)調(diào)用,接下來通過本文給大家介紹android 調(diào)用JNI SO動態(tài)庫的方法,感興趣的朋友一起看看吧2021-11-11

