在應用程式中新增挑選器

Android 提供控制項,讓使用者選擇 立即可用的對話方塊這些挑選工具提供了控制選項,方便您選取各項工具 部分時間 (小時、分鐘、上午/下午) 或日期 (月、日、年)。

,瞭解如何調查及移除這項存取權。
Material.io 中的時間挑選器範例
圖 1.行動版日曆選擇器中的時段選項。

使用這些挑選工具可確保使用者能夠選擇有空的時間或日期 有效、格式正確,並已根據使用者的語言代碼進行調整。

Material.io 中的強制回應日期挑選器範例
圖 2. 強制回應日期挑選器。

建議您使用 DialogFragment 來代管個別時間或日期挑選器DialogFragment 會管理 的對話方塊生命週期,以及讓您在不同版面配置中顯示挑選器 例如手機的基本對話方塊或嵌入 以便大型螢幕顯示版面配置

建立時間挑選器

如要顯示 TimePickerDialog 請使用 DialogFragment,定義可擴充的片段類別 DialogFragment並傳回 TimePickerDialog 片段的 onCreateDialog() 方法。

擴充時間挑選器的 DialogFragment

如要為 TimePickerDialog 定義 DialogFragment, :

範例如下:

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 the user picks.
    }
}

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 the user picks.
    }
}

請參閱TimePickerDialog類別,瞭解 建構函式引數。

現在,您只需要一個新增此片段執行個體的事件至您的 活動。

顯示時間挑選器

定義 DialogFragment (如上述範例所示) 之後 例如,您可以建立 DialogFragment,並呼叫 show() 方法。

比方說,輕觸下方按鈕後,輕觸該按鈕,就能呼叫顯示 對話方塊:

<Button
    android:id="@+id/pickTime"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Pick time" />

當使用者輕觸此按鈕時,系統會呼叫以下方法:

Kotlin

findViewById<Button>(R.id.pickTime).setOnClickListener {
    TimePickerFragment().show(supportFragmentManager, "timePicker")
}

Java

findViewById<Button>(R.id.pickTime).setOnClickListener {
    TimePickerFragment().show(supportFragmentManager, "timePicker");
}

這個方法會在show() 上述範例定義的 DialogFragmentshow() 方法需要 FragmentManager 和片段的專屬標記名稱

建立日期挑選器

建立 DatePickerDialog 就像建立 TimePickerDialog差別在於 您為片段建立的函式。

如要使用 DialogFragment 顯示 DatePickerDialog, 定義擴充 DialogFragment 並傳回 來自片段 onCreateDialog()DatePickerDialog 方法。

擴充日期挑選器的 DialogFragment

如要為 DatePickerDialog 定義 DialogFragment, :

範例如下:

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(requireContext(), this, year, month, day)

    }

    override fun onDateSet(view: DatePicker, year: Int, month: Int, day: Int) {
        // Do something with the date the user picks.
    }
}

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(requireContext(), this, year, month, day);
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
        // Do something with the date the user picks.
    }
}

詳情請參閱 DatePickerDialog 類別。

只需要一個事件,將此片段的例項新增至 活動。

顯示日期挑選器

按照上述範例定義 DialogFragment 後, 您可以建立日期挑選器,方法是建立 DialogFragment並呼叫 show()

比方說,輕觸下方按鈕後,輕觸該按鈕,就能呼叫顯示 對話方塊:

<Button
    android:id="@+id/pickDate"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Pick date"/>

當使用者輕觸此按鈕時,系統會呼叫以下方法:

Kotlin

findViewById<Button>(R.id.pickDate).setOnClickListener {
    val newFragment = DatePickerFragment()
    newFragment.show(supportFragmentManager, "datePicker")
}

Java

findViewById<Button>(R.id.pickDate).setOnClickListener {
    val newFragment = DatePickerFragment();
    newFragment.show(supportFragmentManager, "datePicker");
}

這個方法會在show() 上述範例定義的 DialogFragmentshow() 方法需要 FragmentManager 的例項 和片段的專屬標記名稱

使用具有自動填入功能的挑選器

Android 在 2017 年導入 自動填入架構, 使用者儲存的資料,以便用於在不同的應用程式中填寫表單。挑選器 這在自動填入時非常實用,因為為使用者提供了使用者介面, 值。例如信用卡 日期選擇器,可讓使用者輸入或變更 信用卡。

由於挑選器是對話方塊,因此它們不會與其他欄位一起顯示在活動中。如要在未顯示挑選器時顯示挑選器資料,您可以 另一個資料檢視 (例如 EditText, 在未顯示挑選器時顯示值。

EditText 物件原生需要類型的自動填入資料 AUTOFILL_TYPE_TEXT。 反之,自動填入服務會將資料儲存為 AUTOFILL_TYPE_DATE 以便產生適當的表示法如要解決 類型,建議您建立沿用自 EditText,並實作正確處理 AUTOFILL_TYPE_DATE 類型的值。

請按照下列步驟建立 EditText 的子類別 可以處理 AUTOFILL_TYPE_DATE 類型的值:

  1. 建立從 EditText 沿用的類別。
  2. 實作 getAutofillType() 方法,會傳回 AUTOFILL_TYPE_DATE
  3. 實作 getAutofillValue() 方法,這個方法會傳回 AutofillValue 物件,以毫秒為單位表示日期。如何建立退貨 物件,請使用 forDate() 方法產生 AutofillValue 物件。
  4. 實作 autofill() 方法。這個方法會提供處理 AutofillValue 參數,類型為 AUTOFILL_TYPE_DATE。如要處理參數,請建立 字串表示法,例如 mm/yyyy。使用字串 用於設定檢視區塊的 text 屬性。
  5. 實作以下功能:當使用者想要在 EditText 的自訂子類別中編輯日期時,顯示挑選器。檢視畫面更新 text 屬性,其值為字串表示法 使用者在挑選器上選取的設定。

針對處理的 EditText 子類別範例 AUTOFILL_TYPE_DATE 值,請參閱 JavaKotlin

如要進一步瞭解如何為自訂檢視區塊提供自動填入支援,請參閱 自動填入架構