android時間日期的選擇

時間日期選擇,對于android開發是非常常見的,如果你讓用戶輸入,不但設計稿不會這么寫,自己也覺得別扭。最近因為有時間選擇的需求,所以就用系統的DatePickerDialog和TimePickerDialog再封裝了一些時間選擇的方法。

DatePickerDialog和TimePickerDialog,兩個都是以對話框的形式出現,并在內部實現了布局(不需要添加任何的布局),最最重要的是調用方法簡單易學,now,let's begin.

日期選擇的基本實現


DatePickerDialog怎么用?可以在構造方法源碼一探究竟
筆者在源碼中數了一下,一共有五個構造方法,先介紹最簡單的:

/**
 * @param context The context the dialog is to run in.
 * @param callBack How the parent is notified that the date is set.
 * @param year The initial year of the dialog.
 * @param monthOfYear The initial month of the dialog.
 * @param dayOfMonth The initial day of the dialog.
 */
public DatePickerDialog(Context context,
        OnDateSetListener callBack,
        int year,
        int monthOfYear,
        int dayOfMonth) {
    this(context, 0, callBack, year, monthOfYear, dayOfMonth);
}

通過自帶的注釋應該都懂是各個參數是什么了吧,現在可以寫一個封裝的選擇時間的方法了

使用默認主題的DatePickerDialog:

public static void showDatePickerDialog(Activity activity, final TextView tv, Calendar calendar) {
      // Calendar 需要這樣來得到
      // Calendar calendar = Calendar.getInstance();  
        // 直接創建一個DatePickerDialog對話框實例,并將它顯示出來  
        new DatePickerDialog(activity,  
        // 綁定監聽器(How the parent is notified that the date is set.)
                new DatePickerDialog.OnDateSetListener() {  
                    @Override  
                    public void onDateSet(DatePicker view, int year,  
                            int monthOfYear, int dayOfMonth) {  
                        // 此處得到選擇的時間,可以進行你想要的操作
                        tv.setText("您選擇了:" + year + "年" + monthOfYear  
                                    + "月" + dayOfMonth + "日");  
                    }  
                }  
                // 設置初始日期  
                , calendar.get(Calendar.YEAR)
                ,calendar.get(Calendar.MONTH)
                ,calendar.get(Calendar.DAY_OF_MONTH)).show();  
}

運行結果見最下面的運行圖

下面就來挨個看看他的構造方法,注釋很詳細,不外乎就是那幾個參數,如果傳入就用傳入的,沒有就用默認的:
第一個:

/**
 * Creates a new date picker dialog for the current date using the parent
 * context's default date picker dialog theme.
 *
 * @param context the parent context
 */
public DatePickerDialog(@NonNull Context context) {
    this(context, 0, null, Calendar.getInstance(), -1, -1, -1);
}

第二個:

/**
 * Creates a new date picker dialog for the current date.
 *
 * @param context the parent context
 * @param themeResId the resource ID of the theme against which to inflate
 *                   this dialog, or {@code 0} to use the parent
 *                   {@code context}'s default alert dialog theme
 */
public DatePickerDialog(@NonNull Context context, @StyleRes int themeResId) {
    this(context, themeResId, null, Calendar.getInstance(), -1, -1, -1);
}

第三個:

/**
 * Creates a new date picker dialog for the specified date.
 *
 * @param context the parent context
 * @param themeResId the resource ID of the theme against which to inflate
 *                   this dialog, or {@code 0} to use the parent
 *                   {@code context}'s default alert dialog theme
 * @param listener the listener to call when the user sets the date
 * @param year the initially selected year
 * @param monthOfYear the initially selected month of the year (0-11 for
 *                    compatibility with {@link Calendar#MONTH})
 * @param dayOfMonth the initially selected day of month (1-31, depending
 *                   on month)
 */
public DatePickerDialog(@NonNull Context context, @StyleRes int themeResId,
        @Nullable OnDateSetListener listener, int year, int monthOfYear, int dayOfMonth) {
    this(context, themeResId, listener, null, year, monthOfYear, dayOfMonth);
}

因為最后一個構造方法是private的,所以就補貼出來了;

現在 我們用第三個來指定主題 (敲黑板),以下常量:


而筆者親測>=5或者<=0時就會使用默認主題,所以上述常量是沒有5的!?。?!

改起來也是非常簡單的,直接添加一個參數就ok,直接上代碼咯

public static void showDatePickerDialog(Activity activity, int themeResId, final TextView tv, Calendar calendar) {
        // 直接創建一個DatePickerDialog對話框實例,并將它顯示出來  
        new DatePickerDialog(activity
                ,  themeResId
        // 綁定監聽器(How the parent is notified that the date is set.)
                ,new DatePickerDialog.OnDateSetListener() {  
                    @Override  
                    public void onDateSet(DatePicker view, int year,  
                            int monthOfYear, int dayOfMonth) {  
                        // 此處得到選擇的時間,可以進行你想要的操作
                        tv.setText("您選擇了:" + year + "年" + monthOfYear  
                                    + "月" + dayOfMonth + "日");  
                    }  
                }  
                // 設置初始日期  
                , calendar.get(Calendar.YEAR)
                ,calendar.get(Calendar.MONTH)
                ,calendar.get(Calendar.DAY_OF_MONTH)).show();  
}

時間選擇的基礎實現


TimePickerDialog構造方法源碼一探究竟

/**
 * Creates a new time picker dialog.
 *
 * @param context the parent context
 * @param listener the listener to call when the time is set
 * @param hourOfDay the initial hour
 * @param minute the initial minute
 * @param is24HourView whether this is a 24 hour view or AM/PM
 */
public TimePickerDialog(Context context, OnTimeSetListener listener, int hourOfDay, int minute,
        boolean is24HourView) {
    this(context, 0, listener, hourOfDay, minute, is24HourView);
}               

動手封裝一下吧

public static void showTimePickerDialog(Activity activity, final TextView tv, Calendar calendar) {
// Calendar c = Calendar.getInstance();  
            // 創建一個TimePickerDialog實例,并把它顯示出來  
           // 解釋一哈,Activity是context的子類
            new TimePickerDialog( activity,  
            // 綁定監聽器  
                    new TimePickerDialog.OnTimeSetListener() {  
                        @Override  
                        public void onTimeSet(TimePicker view,  
                                int hourOfDay, int minute) {  
                            tv.setText("您選擇了:" + hourOfDay + "時" + minute  
                                    + "分");  
                        }  
                    }  
                    // 設置初始時間  
                    , calendar.get(Calendar.HOUR_OF_DAY)
                    , calendar.get(Calendar.MINUTE)
                    // true表示采用24小時制  
                    ,true).show();  
}

同樣,日期有兩個構造方法,另一個可以設置主題

/**
 * Creates a new time picker dialog with the specified theme.
 * <p>
 * The theme is overlaid on top of the theme of the parent {@code context}.
 * If {@code themeResId} is 0, the dialog will be inflated using the theme
 * specified by the
 * {@link android.R.attr#timePickerDialogTheme android:timePickerDialogTheme}
 * attribute on the parent {@code context}'s theme.
 *
 * @param context the parent context
 * @param themeResId the resource ID of the theme to apply to this dialog
 * @param listener the listener to call when the time is set
 * @param hourOfDay the initial hour
 * @param minute the initial minute
 * @param is24HourView Whether this is a 24 hour view, or AM/PM.
 */
public TimePickerDialog(Context context, int themeResId, OnTimeSetListener listener,
        int hourOfDay, int minute, boolean is24HourView) {...}

theme :
THEME_TRADITIONAL
- The traditional (pre-Holo) alert dialog theme (int 1)

THEME_HOLO_DARK
- The holographic alert theme with a dark background (int 2)

THEME_HOLO_LIGHT
- The holographic alert theme with a light background (int 3)

THEME_DEVICE_DEFAULT_DARK
- The device's default alert theme with a dark background. (int 4)

THEME_DEVICE_DEFAULT_LIGHT
- The device's default alert theme with a light background. (int 5)

上面已經改過,這么簡單就不貼代碼了
而筆者親測>=5或者<=0時就會使用默認主題,所以上述常量也是沒有5的?。。?!

MainActicity
MainActicity

TimePickerDialog.THEME_HOLO_DARK之類的手法可以得到對應的int值

運行結果 (測試手機為android5.1.1 api22)

選擇日期(默認主題:0

選擇日期(主題:1)

選擇日期(主題:2)

選擇日期(主題:3)

選擇日期(主題:4)
選擇時間(默認主題:0)

選擇時間(主題:1)

選擇時間(主題:2)

選擇時間(主題:3)

選擇時間(主題:4)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,732評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,214評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,781評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,588評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,315評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,699評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,882評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,441評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,189評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,388評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,613評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,023評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,310評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,112評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,334評論 2 377

推薦閱讀更多精彩內容