Android 以可直接使用的對話方塊提供控制項,供使用者選擇時間或日期。每個挑選器都提供用於選擇時間部分 (小時、分鐘、上午/下午) 或日期部分 (月、日、年) 的控制項。使用這些挑選器,有助於確保使用者能選擇有效、格式正確且符合使用者當地區域的時間或日期。

建議您使用 DialogFragment
託管每個時間或日期挑選器。DialogFragment
可為您管理對話方塊的生命週期,並允許在不同版面配置設定中顯示挑選器,例如在手機的基本對話方塊中顯示,或做為大型螢幕上版面配置的內嵌部分顯示。
雖然 DialogFragment
最初是在 Android 3.0 (API 級別 11) 中加入平台,但如果應用程式支援 Android 3.0 以下版本 (甚至低於 Android 1.6),則可以使用支援資料庫中提供的 DialogFragment
類別,獲得回溯相容性。
注意:下列程式碼範例示範如何使用 DialogFragment
的支援資料庫 API,建立時間挑選器和日期挑選器的對話方塊。如果應用程式的 minSdkVersion
為 11 或以上版本,您可以改用 DialogFragment
的平台版本。
主要類別如下:
另請參閱片段總覽。
建立時間挑選器
如要使用 DialogFragment
顯示 TimePickerDialog
,您需要定義擴充 DialogFragment
的片段類別,並從片段的 onCreateDialog()
方法傳回 TimePickerDialog
。
注意:如果您的應用程式支援 3.0 以下版本的 Android 版本,請確認您已使用支援資料庫設定 Android 專案 (如設定專案以使用資料庫中所述)。
擴充時間挑選器的 DialogFragment
如要為 TimePickerDialog
定義 DialogFragment
,您必須:
- 定義
onCreateDialog()
方法以傳回TimePickerDialog
的執行個體 - 實作
TimePickerDialog.OnTimeSetListener
介面,以便在使用者設定時間時接收回呼。
範例如下:
Kotlin
class TimePickerFragment : DialogFragment(), TimePickerDialog.OnTimeSetListener { override fun onCreateDialog(savedInstanceState: Bundle): Dialog { // Use the current time as the default values for the picker val c = Calendar.getInstance() val hour = c.get(Calendar.HOUR_OF_DAY) val minute = c.get(Calendar.MINUTE) // Create a new instance of TimePickerDialog and return it return TimePickerDialog(activity, this, hour, minute, DateFormat.is24HourFormat(activity)) } override fun onTimeSet(view: TimePicker, hourOfDay: Int, minute: Int) { // Do something with the time chosen by the user } }
Java
public static class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Use the current time as the default values for the picker final Calendar c = Calendar.getInstance(); int hour = c.get(Calendar.HOUR_OF_DAY); int minute = c.get(Calendar.MINUTE); // Create a new instance of TimePickerDialog and return it return new TimePickerDialog(getActivity(), this, hour, minute, DateFormat.is24HourFormat(getActivity())); } public void onTimeSet(TimePicker view, int hourOfDay, int minute) { // Do something with the time chosen by the user } }
如要進一步瞭解建構函式引數,請參閱 TimePickerDialog
類別。
現在,您只需將該片段的執行個體新增至活動即可。
顯示時間挑選器
定義如上所示的 DialogFragment
後,您可以建立 DialogFragment
的執行個體並呼叫 show()
,以顯示時間挑選器。
例如,在點選下方按鈕後,即會呼叫一個方法來顯示對話方塊:
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/pick_time" android:onClick="showTimePickerDialog" />
當使用者點選此按鈕時,系統會呼叫以下方法:
Kotlin
fun showTimePickerDialog(v: View) { TimePickerFragment().show(supportFragmentManager, "timePicker") }
Java
public void showTimePickerDialog(View v) { DialogFragment newFragment = new TimePickerFragment(); newFragment.show(getSupportFragmentManager(), "timePicker"); }
這個方法會在上述 DialogFragment
的新執行個體中呼叫 show()
。show()
方法需要 FragmentManager
的執行個體和片段的專屬標記名稱。
注意:如果您的應用程式支援 Android 3.0 以下版本,請務必呼叫 getSupportFragmentManager()
來取得 FragmentManager
的執行個體。此外,請確保顯示時間挑選器的活動擴充 FragmentActivity
,而非標準 Activity
類別。
建立日期挑選器
建立 DatePickerDialog
的過程與建立 TimePickerDialog
相似。唯一的差別在於您為片段建立的對話方塊。
如要使用 DialogFragment
顯示 DatePickerDialog
,您需要定義擴充 DialogFragment
的片段類別,並從片段的 onCreateDialog()
方法傳回 DatePickerDialog
。
擴充日期挑選器的 DialogFragment
如要為 DatePickerDialog
定義 DialogFragment
,您必須:
- 定義
onCreateDialog()
方法以傳回DatePickerDialog
的執行個體 - 實作
DatePickerDialog.OnDateSetListener
介面,以便在使用者設定日期時接收回呼。
範例如下:
Kotlin
class DatePickerFragment : DialogFragment(), DatePickerDialog.OnDateSetListener { override fun onCreateDialog(savedInstanceState: Bundle): Dialog { // Use the current date as the default date in the picker val c = Calendar.getInstance() val year = c.get(Calendar.YEAR) val month = c.get(Calendar.MONTH) val day = c.get(Calendar.DAY_OF_MONTH) // Create a new instance of DatePickerDialog and return it return DatePickerDialog(activity, this, year, month, day) } override fun onDateSet(view: DatePicker, year: Int, month: Int, day: Int) { // Do something with the date chosen by the user } }
Java
public static class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Use the current date as the default date in the picker 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); // Create a new instance of DatePickerDialog and return it return new DatePickerDialog(getActivity(), this, year, month, day); } public void onDateSet(DatePicker view, int year, int month, int day) { // Do something with the date chosen by the user } }
如要進一步瞭解建構函式引數,請參閱 DatePickerDialog
類別。
現在,您只需將該片段的執行個體新增至活動即可。
顯示日期挑選器
定義如上所示的 DialogFragment
後,您可以建立 DialogFragment
的執行個體並呼叫 show()
,以顯示日期挑選器。
例如,在點選下方按鈕後,即會呼叫一個方法來顯示對話方塊:
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/pick_date" android:onClick="showDatePickerDialog" />
當使用者點選此按鈕時,系統會呼叫以下方法:
Kotlin
fun showDatePickerDialog(v: View) { val newFragment = DatePickerFragment() newFragment.show(supportFragmentManager, "datePicker") }
Java
public void showDatePickerDialog(View v) { DialogFragment newFragment = new DatePickerFragment(); newFragment.show(getSupportFragmentManager(), "datePicker"); }
這個方法會在上述 DialogFragment
的新執行個體中呼叫 show()
。show()
方法需要 FragmentManager
的執行個體和片段的專屬標記名稱。
使用具有自動填入功能的挑選器
Android 8.0 引入了自動填入架構,讓使用者儲存資料,以便之後用於在其他應用程式中填寫表單。挑選器提供了一個 UI,可讓使用者變更日期或時間資料儲存欄位中的值,因此在自動填入情境中可能會非常有用。例如,在信用卡表單中,日期挑選器可讓使用者輸入或變更信用卡的到期日。
由於挑選器是對話方塊,因此它們不會與其他欄位一起顯示在活動中。如要在未顯示挑選器時顯示挑選器資料,可以使用另一檢視區塊 (例如 EditText
),在未顯示挑選器時顯示該值。
EditText
物件原生需要 AUTOFILL_TYPE_TEXT
類型的自動填入資料。相反地,自動填入服務應將資料儲存為 AUTOFILL_TYPE_DATE
,以便能夠建立適當的表示法。如要解決類型不一致問題,建議您建立從 EditText
沿用的自訂檢視區塊,並實作正確處理 AUTOFILL_TYPE_DATE
類型值所需的方法。
請按照下列步驟建立 EditText
的子類別,該子類別能夠處理 AUTOFILL_TYPE_DATE
類型的值:
- 建立從
EditText
沿用的類別。 - 實作
getAutofillType()
方法,該方法應傳回AUTOFILL_TYPE_DATE
。 - 實作
getAutofillValue()
方法,該方法應傳回表示日期 (以毫秒為單位) 的AutofillValue
物件。如要建立傳回物件,請使用forDate()
方法產生AutofillValue
物件。 - 實作
autofill()
方法。這種方法提供處理AUTOFILL_TYPE_DATE
參數的邏輯,參數類型為AutofillValue
。如要處理參數,請為參數建立適當的字串表示,例如mm/yyyy
。使用字串表示來設定檢視區塊的text
屬性。 - 實作以下功能:當使用者想要在
EditText
的自訂子類別中編輯日期時,顯示挑選器。檢視區塊應使用挑選器上所選值的字串表示更新text
屬性。
如要查看處理 AUTOFILL_TYPE_DATE
值的 EditText
子類別範例,請參閱自動填入架構範例 Java | Kotlin。
如要進一步瞭解如何為自訂檢視區塊提供自動填入支援,請參閱支援自訂檢視區塊。