Photo by Markus Winkler on Unsplash
DatePicker 和 TimePicker 在 Android 元件中,常被用來協助使用者選擇日期和時間,本篇要來看一下如何使用這兩個元件。這兩個元件會佔用較大版面,我們試著使用 onClick() 呼叫日期/時間輔助對話框來協助使用者選擇。
[DatePicker]
DatePicker 日期選擇元件會在畫面上出現一個日期的選擇框,目的是協助使用者使用日曆的方式來選擇日期。通常如果只是在佈局 Layout 中使用 DatePicker 元件時,會發現選擇的日期需要透過 java/kotlin 程式傳給其他元件,或進行顯示。缺點是佔用太多畫面來顯示日期選擇框,因此有些設計者會使用 onClick()方法,呼叫 DatePickerDialog 來呈現日期選擇框,選擇完成後,將結果傳給文字框或編輯框。如要使用 DatePicker ,可在 Layout 佈局檔 XML 中使用 <DatePicker> 標記來設定,語法格式如下:<DatePicker android:屬性 = "值"> </DatePicker>
DatePicker 沒有提供專門的方法來獲得它的值,如果要取得使用者按下的值,只能通過 Calendar.getInstance().get() 方法獲取年月日值。DatePicker 繼承自 android.widget.FrameLayout,除了 FrameLayout 可用的屬性外,還有以下幾種:
| XML屬性 | 說明 |
|---|---|
| calendarTextColor | 日曆清單的文字顏色。 |
| calendarViewShown | 是否顯示日曆視圖。 |
| datePickerMode | 設定 datePicker 的外觀,有calendar(預設)和 spinner兩種。 |
| dayOfWeekBackground | 星期列的背景顏色。 |
| dayOfWeekTextAppearance | 星期列的文字顏色。 |
| startYear | 設置可選擇的第一年。 |
| endYear | 設定可選之結束年。 |
| firstDayOfWeek | 設定日曆列表以星期幾開始。 |
| headerBackground | 整個表頭的背景顏色。 |
| headerDayOfMonthTextAppearance | 表頭日期字體的顏色。 |
| headerMonthTextAppearance | 表頭月份的字體顏色。 |
| headerYearTextAppearance | 表頭年份的字體顏色。 |
| maxDate | 最大日期,以 mm/dd/yyyy 格式顯示在日曆上。 |
| minDate | 最小日期,以 mm/dd/yyyy 格式顯示在日曆上。 |
| spinnersShown | 是否顯示 spinner 外觀。 |
| yearListItemTextAppearance | 清單的文本出現在清單中。 |
| yearListSelectorColor | 年列表選擇的顏色 |
datePickerMode 設定 DatePicker 的樣式有 calendar(下圖左上)和 spinner(下圖左下)兩種。timePickerMode 設定 TimePicker 的外觀,主要有 clock(預設)(下圖右上) 和 spinner (下圖右下)兩種。
DatePickerDialog 是一個彈出對話方塊用於選擇日期,如果要使用 java/kotlin 呼叫日期選擇對話框,可以使用 DatePickerDialog() 這個方法:
DatePickerDialog(Context context, DatePickerDialog.OnDateSetListener listener,
int year, int monthOfYear, int dayOfMonth)
DatePickerDialog()參數說明如下:- context:當前上下文
- listener:日期改變監聽器
- year:年
- monthOfYear:月
- dayOfMonth:日
DatePickerDialog()繼承自 android.app.AlertDialog,因此具有 AlertDialog 相關屬性可以使用。如要使用 DatePickerDialog() ,只要 new 一個 DatePickerDialog 物件,然後調用 .show() 方法就可以將時間選擇對話框顯示出來。DatePickerDialog 有相對應的事件監聽器,用於獲取當前所設置的事件。
其他常用的方法還有:
- int getDayOfMonth():取得選取的日期
- int getMonth():取得選取的月份,從0開始,0表示1月
- int getYear():取得選取的年份
- void updateDate(int year, int month, int dayOfMonth):更改選取日期
[TimePicker]
TimePicker 時間選擇元件會在畫面上出現一個時間的選擇框,目的是協助使用者使用時鐘的方式來選擇時間,可以是 24 小時制或 AM/PM 12 小時制。通常如果只是在佈局 Layout 中使用 TimePicker 元件時,會發現選擇的時間需要透過 java/kotlin 程式傳給其他元件,或進行顯示。缺點是佔用太多畫面來顯示時間選擇框,因此有些設計者會使用 onClick()方法,呼叫 TimePickerDialog 來呈現時間選擇框,選擇完成後,將結果傳給文字框或編輯框。如要使用 TimePicker,可在 Layout 佈局檔 XML 中使用 <TimePicker> 標記來設定,語法格式如下:<TimePicker android:屬性 = "值"> </TimePicker>TimePicker 沒有提供專門的方法來獲得它的值,如果要取得使用者按下的值,只能通過 Calendar.getInstance().get() 方法獲取時、分值。TimePicker 繼承自 android.widget.FrameLayout,除了 FrameLayout 可用的屬性外,還有以下幾種:
| XML屬性 | 說明 |
|---|---|
| timePickerMode | 設定 TimePicker 的外觀,參考上方右圖,有 clock(預設)(下圖右上) 和 spinner(下圖右下) 兩種。 |
TimePickerDialog(Context context, TimePickerDialog.OnTimeSetListener listener, int hourOfDay, int minute, boolean is24HourView)參數說明如下:
- context:當前上下文。
- listener:時間改變監聽器。
- hourOfDay:初始化 小時。
- minute:初始化 分鐘。
- is24HourView:是否以 24 小時顯示時間,true 為 24 小時制。
TimePickerDialog()繼承自 android.app.AlertDialog,因此具有 AlertDialog 相關屬性可以使用。如要使用 TimePickerDialog() ,只要 new 一個 TimePickerDialog 物件,然後調用 .show() 方法就可以將時間選擇對話框顯示出來。TimePickerDialog 有相對應的事件監聽器,用於獲取當前所設置的事件。
[程式範例]
(1)新建一個模組 Module,進入 res/layout 目錄下點選佈局檔 activity_main.xml。將預設的內容刪除,建立 2 個 EditText 文字編輯框,並設定 onClick() 呼叫的程序名稱,以下是整個 XML 的內容。<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:layout_centerVertical="true"
android:orientation="vertical">
<EditText
android:id="@+id/applydate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="50sp"
android:layout_marginTop="30sp"
android:layout_marginRight="30sp"
android:inputType="date"
android:text=" 日期: YYYY-MM-DD "
android:onClick="datePicker"
android:textSize="26sp" />
<EditText
android:id="@+id/applytime"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="50sp"
android:layout_marginTop="30sp"
android:layout_marginRight="30sp"
android:inputType="time"
android:text=" 時間: HH:MM "
android:onClick="timePicker"
android:textSize="26sp" />
</LinearLayout>
(2)在 MainActivity.java 在 onCreate() 方法內,先建立與佈局檔的物件,用 findValueById 連結元件,建立 datePicker 和 timePicker 兩個子程序,在程序內呼叫 datePickerDialog 和 timePickerDialog,然後改寫(Override)兩個方法:onDateSet 和 onTimeSet,將取得的值指定給日期和時間編輯框。程式碼如下:
package com.example.mydatetime;
import androidx.appcompat.app.AppCompatActivity;
import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TimePicker;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;
public class dt_MainActivity extends AppCompatActivity {
private EditText applydate = null;
private EditText applytime = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dt_main);
// 視窗最大化
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
applydate = findViewById(R.id.applydate);
applytime = findViewById(R.id.applytime);
}
public void datePicker(View v) {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR); //取得現在的日期年月日
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
new DatePickerDialog(v.getContext(), new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
String datetime = String.valueOf(year) + "-" + String.valueOf(month) + "-" + String.valueOf(day);
applydate.setText(datetime); //取得選定的日期指定給日期編輯框
}
}, year, month, day).show();
}
public void timePicker(View v) {
Calendar calendar = Calendar.getInstance();
int hourOfDay = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
new TimePickerDialog(v.getContext(), new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
String datetime = String.valueOf(hourOfDay) + ":" + String.valueOf(minute);
applytime.setText(datetime); //取得選定的時間指定給時間編輯框
}
}, hourOfDay, minute,true).show();
}
}
執行的結果如下:
[參考資料]
- Developer : DatePicker
- Developer : TimePicker
- CSDN:Android之TimePickerDialog使用



請問activity_dt_main為何會顯示錯誤,感謝
回覆刪除張貼留言