Android มีตัวควบคุมให้ผู้ใช้เลือกเวลาหรือวันที่เป็นกล่องโต้ตอบที่พร้อมใช้งาน ตัวเลือกเหล่านี้มีตัวควบคุมสำหรับเลือกแต่ละส่วนของเวลา (ชั่วโมง นาที AM/PM) หรือวันที่ (เดือน วัน ปี)
การใช้เครื่องมือเลือกเหล่านี้ช่วยให้มั่นใจได้ว่าผู้ใช้จะเลือกเวลาหรือวันที่ที่ ถูกต้อง จัดรูปแบบอย่างถูกต้อง และปรับตามภาษาของผู้ใช้ได้
เราขอแนะนำให้คุณใช้
DialogFragment
เพื่อโฮสต์เครื่องมือเลือกเวลาหรือวันที่แต่ละรายการ DialogFragment จัดการวงจรของกล่องโต้ตอบให้คุณ และช่วยให้คุณแสดงเครื่องมือเลือกในการกำหนดค่าเลย์เอาต์ต่างๆ ได้ เช่น ในกล่องโต้ตอบพื้นฐานบนโทรศัพท์มือถือ หรือเป็นส่วนที่ฝังไว้ของเลย์เอาต์บนหน้าจอขนาดใหญ่
สร้างเครื่องมือเลือกเวลา
หากต้องการแสดง
TimePickerDialog
โดยใช้ DialogFragment ให้กำหนดคลาส Fragment ที่ขยาย DialogFragment และส่งคืน TimePickerDialog จากเมธอด onCreateDialog()
ของ Fragment
ขยาย DialogFragment สำหรับเครื่องมือเลือกเวลา
วิธีกำหนด DialogFragment สำหรับ TimePickerDialog
ให้ทำดังนี้
- กำหนด
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 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
ตอนนี้คุณเพียงแค่ต้องมีเหตุการณ์ที่เพิ่มอินสแตนซ์ของ Fragment นี้ลงในกิจกรรม
แสดงเครื่องมือเลือกเวลา
หลังจากกำหนด 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() ในอินสแตนซ์ใหม่ของ
DialogFragment ที่กำหนดไว้ในตัวอย่างก่อนหน้า เมธอด
show()ต้องมีอินสแตนซ์ของ
FragmentManager
และชื่อแท็กที่ไม่ซ้ำกันสำหรับ Fragment
สร้างเครื่องมือเลือกวันที่
การสร้าง
DatePickerDialog
ก็เหมือนกับการสร้างTimePickerDialog ความแตกต่างคือกล่องโต้ตอบ
ที่คุณสร้างขึ้นสำหรับ Fragment
หากต้องการแสดง DatePickerDialog โดยใช้ DialogFragment
ให้กำหนดคลาส Fragment ที่ขยาย DialogFragment และส่งคืน DatePickerDialog จากเมธอด onCreateDialog()
ของ Fragment
ขยาย DialogFragment สำหรับเครื่องมือเลือกวันที่
วิธีกำหนด DialogFragment สำหรับ DatePickerDialog
ให้ทำดังนี้
- กำหนด
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(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
คุณเพียงแค่ต้องมีเหตุการณ์ที่เพิ่มอินสแตนซ์ของ Fragment นี้ลงในกิจกรรม
แสดงเครื่องมือเลือกวันที่
หลังจากกำหนด 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() ในอินสแตนซ์ใหม่ของ
DialogFragment ที่กำหนดไว้ในตัวอย่างก่อนหน้า เมธอด
show() ต้องมีอินสแตนซ์ของ FragmentManager
และชื่อแท็กที่ไม่ซ้ำกันสำหรับ Fragment
ใช้เครื่องมือเลือกกับการป้อนข้อความอัตโนมัติ
ในปี 2017 Android ได้เปิดตัวเฟรมเวิร์กการป้อนข้อความอัตโนมัติ ซึ่งช่วยให้ผู้ใช้บันทึกข้อมูลที่ใช้กรอกแบบฟอร์มในแอปต่างๆ ได้ ตัวเลือก อาจมีประโยชน์ในสถานการณ์การป้อนข้อความอัตโนมัติโดยการแสดง 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()เมธอดนี้มีตรรกะในการจัดการพารามิเตอร์AutofillValueซึ่งมีประเภทเป็นAUTOFILL_TYPE_DATEหากต้องการจัดการพารามิเตอร์ ให้สร้าง การแสดงสตริงที่เหมาะสม เช่นmm/yyyyใช้การแสดงสตริง เพื่อตั้งค่าพร็อพเพอร์ตี้textของมุมมอง - ใช้ฟังก์ชันการทำงานที่แสดงเครื่องมือเลือกเมื่อผู้ใช้ต้องการแก้ไข
วันที่ในคลาสย่อยที่กำหนดเองของ
EditTextมุมมองจะอัปเดตtextพร็อพเพอร์ตี้ด้วยการแสดงค่าเป็นสตริง ที่ผู้ใช้เลือกในเครื่องมือเลือก
ดูตัวอย่างคลาสย่อยของ EditText ที่จัดการค่า
AUTOFILL_TYPE_DATE ได้ในตัวอย่างเฟรมเวิร์กการป้อนข้อความอัตโนมัติใน
Java
หรือ
Kotlin
ดูข้อมูลเพิ่มเติมเกี่ยวกับการพิสูจน์การรองรับการป้อนข้อความอัตโนมัติสําหรับมุมมองที่กําหนดเองได้ที่เฟรมเวิร์กการป้อนข้อความอัตโนมัติ