文末提供源碼下載地址!!!java
效果見圖:git
對於gif的錄製,採用的是LICEcap軟件,mac,windows均可以。windows
對於這個選擇器,主要的幾個功能的實現:ide
1. 時間的處理佈局
主要用的是Calendar類,能夠方便的對日期進行加減。spa
獲取實例:.net
_currentCalendar = Calendar.getInstance();
計算日期的加減發:code
_currentCalendar.add(Calendar.YEAR,+1); _currentCalendar.add(Calendar.MONTH,-1);
時間的顯示:orm
每個方框中都是一個TextView,分別獲取年,月,日,時,分設置在TextView上,獲取時間的方法:blog
calendar.get(Calendar.YEAR)//獲取年份
須要注意的是月份在獲取的時候是少一個月的,好比如今是10月,當調用
calendar.get(Calendar.MONTH)
的時候返回的是9.
2.時間的顯示格式,12H和24H
由於本例中須要處理12H格式和24H格式,文中採用的是:
DateFormat.is24HourFormat(getDialog().getContext())
經過調用這個方法,獲得系統中用戶設定默認的時間格式。返回true即爲24小時格式。
當用戶在時間選擇器上選擇12H時,用如下方法來保證小時部分顯示正確:
int h = (calendar.get(Calendar.HOUR_OF_DAY)+12)%12; if(h==0){ h = 12; }
簡單粗暴。
3.dialog在界面上顯示的大小
開發中常常碰到dilog不能理想的顯示的問題,本例中自定義了一個DialogFragment,在Dialog的onStart方法中調用如下代碼,能夠設置dialog相對於界面的大小比例:
public void onStart() { super.onStart(); DisplayMetrics dm = new DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm); //設置dialog在界面上所在寬高佔比0.75 0.5 getDialog().getWindow().setLayout((int) (dm.widthPixels * 0.75), (int) (dm.widthPixels * 0.5)); }
文中設置寬度爲全屏的3/4,高度爲全屏的1/2。
最後說下大致思路:
主Activity的佈局文件中只有一個按鈕,用來出發Dialog。自定義了一個DataPickerDialog,繼承自DialogFragment,它有一個監聽,在DataPickerDialog中定義了一個接口,用來處理彈框中的肯定和取消事件。onSure方法中能夠獲得當前時間(用Calendar承載的)和當前值的時間格式,String類型,在DataPickerDialog中有定義。
DataPickerDialog.java中主要設置一些按鈕的監聽。確認取消鍵提供接口共外部使用。這個Dialog佈局的的中間一些調節時間的上下按鍵設置響應事件。若是一個一個find的話太麻煩了,其實六個是同樣的,能夠再封裝一次。因而自定義一個DataPickerItemView。另外,這個文件中對時間進行統一處理:
@Override public void onItemUpPress(View v) { switch (v.getId()){ case R.id.data_picker_item_year: _currentCalendar.add(Calendar.YEAR,+1); break; case R.id.data_picker_item_month: _currentCalendar.add(Calendar.MONTH,+1); break; case R.id.data_picker_item_day: _currentCalendar.add(Calendar.DAY_OF_MONTH,+1); break; case R.id.data_picker_item_hour: _currentCalendar.add(Calendar.HOUR_OF_DAY,+1); break; case R.id.data_picker_item_min: _currentCalendar.add(Calendar.MINUTE,+1); break; case R.id.data_picker_item_format: switchFormat(); break; default: } setCurrentDate(_currentCalendar,_currentFormat); } @Override public void onItemBottomPress(View v) { switch (v.getId()){ case R.id.data_picker_item_year: _currentCalendar.add(Calendar.YEAR,-1); break; case R.id.data_picker_item_month: _currentCalendar.add(Calendar.MONTH,-1); break; case R.id.data_picker_item_day: _currentCalendar.add(Calendar.DAY_OF_MONTH,-1); break; case R.id.data_picker_item_hour: _currentCalendar.add(Calendar.HOUR_OF_DAY,-1); break; case R.id.data_picker_item_min: _currentCalendar.add(Calendar.MINUTE,-1); break; case R.id.data_picker_item_format: switchFormat(); break; default: } setCurrentDate(_currentCalendar,_currentFormat); }
DataPickerItemView.java有三個控件兩個ImageButton,一個TextView,提供方法setText(Object number)來設置須要顯示的數字。在組件中提供上下兩個ImageButton點擊事件的接口,傳出參數爲DataPickerItemView這個View,以方便在DataPickerDialog.java中集中處理時間的變化。