標籤:android blog class code java ext
在android開發中,時間控制項是不可或缺的一部分,特別是在設定個人生日或按時間進行搜尋時都要用到。Android有內建的DatePicker和timePicker,使用起來也是相當的方便,既可以在布局中添加後findViewById調用,也可以直接在activity中重寫onCreateDialog(int id)方法後調用showDialog(int id)彈出,現在網上關於android時間控制項的demo也大都基於這兩個控制項的使用說明。但用過這兩個控制項的人都知道,這兩個時間選擇框有兩個不太好的地方:1、不是特別美觀2、時間控制項生命週期不可控。如果想解決上面的問題,我們一般都會通過繼承Dialog,寫一個美觀並且滿足要求的時間控制項。但這樣花費的時間肯定比使用DatePicker和timePicker要多得多。
當然,網上還是有很多不錯的開源時間控制項供我們選擇,如android-wheel,它是一個仿IOS滾輪樣式的時間選擇控制項(地址:https://github.com/maarek/android-wheel),如下:
android-spinnerwheel也是一個比錯的時間選擇控制項(地址:https://github.com/ai212983/android-spinnerwheel),如下:
用過datePicker和timepicker的人應該都知道showDialog(int id)其實是一個已經過時的方法,在方法的說明中我們可以找到這麼一段話:This method was deprecated in API level 13.Use the new DialogFragment class with FragmentManager instead; this is also available on older platforms through the Android compatibility package.
大概意思是:showDialog(int id)這個方法在API 13就已經過時了,新API可以通過使用DialogFragment類和FragmentManager代替它,DailogFragment和FragmentManager在版本API(低於13)也是可用的,但是需要引入相容包。
那下面我們來看看怎麼通過DialogFragment和FragmentManager來實現選擇時間,以及它相對於showDialog(int id)有哪些優勢?
我們首先去android開發人員官網找,其中官網就有這麼一句話:The DialogFragment manages the dialog lifecycle for you and allows you to display the pickers in different layout configurations, such as in a basic dialog on handsets or as an embedded part of the layout on large screens.
大概意思就是:DialogFragment可以讓我們自己去行政時間選擇控制項的生命週期並且可以讓我們自己給控制項設定不同的配置參數,即可以讓控制項以基本形狀顯示,也可以放到一個布局中包裹著顯示在大螢幕手機上。
同樣,官網上DialogFragment的使用也是很方便的。下面我們來看看:
首先,我們要自訂個Fragement並讓他它繼承DialogFragment,還需要讓它實現TimePickerDialog.OnTimeSetListener
介面,代碼如下:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener{ int _year=1970; int _month=0; int _day=0; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Calendar c=Calendar.getInstance(); int year=c.get(Calendar.YEAR); int month=c.get(Calendar.MONTH); int day=c.get(Calendar.DAY_OF_MONTH); return new DatePickerDialog(getActivity(), this, year, month, day); } @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { // TODO 日期選擇完成事件,取消時不會觸發 _year=year; _month=monthOfYear+1; _day=dayOfMonth; Log.i(Constant.LOG_TAG, "year="+year+",monthOfYear="+monthOfYear+",dayOfMonth="+dayOfMonth); } private String getValue(){ return ""+_year+_month+_day; } } |
當我們點擊某個控制項後要彈出時間選取器只要直接調用下面的方法就行了。
?
| 1 2 3 4 |
private void showDatePickerFragemnt(){ DialogFragment fragment=new DatePickerFragment(); fragment.show(getSupportFragmentManager(), "datePicker"); } |
需要我們注意的是,你的activity是需要繼承FragmentActivity或ActionBarActivity的,不然無法獲得FragmentManager。
更多DialogFragment使用說明地址,大家可以去http://developer.android.com/guide/topics/ui/controls/pickers.html。