Android時間選擇器

文末提供源碼下載地址!!!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中集中處理時間的變化。

        最後的最後,上源碼:http://git.oschina.net/164587694/MyDatePicker

本文地址:https://my.oschina.net/reone/blog/759774

相關文章
相關標籤/搜索