ב-Android יש פקדים שמאפשרים למשתמש לבחור תאריך או שעה בתיבות דו-שיח מוכנות לשימוש. הבוררים האלה מספקים אמצעי בקרה לבחירה של כל חלק משעה (שעה, דקה, AM/PM) או תאריך (חודש, יום, שנה).
השימוש בבוררי התאריכים והשעות האלה עוזר להבטיח שהמשתמשים יוכלו לבחור תאריך או שעה תקינים, בפורמט הנכון ובהתאם לאזור הזמן שלהם.
מומלץ להשתמש ב-DialogFragment
כדי לארח כל בורר תאריכים או שעות. ה-DialogFragment
מנהל את מחזור החיים של תיבת הדו-שיח ומאפשר להציג בוחרים בהגדרות פריסה שונות, למשל בתיבת דו-שיח בסיסית במכשירים ניידים או כחלק מוטמע בפריסה במסכים גדולים.
יצירת בורר זמן
כדי להציג TimePickerDialog
באמצעות DialogFragment
, מגדירים סוג של קטע קוד שמרחיב את DialogFragment
ומחזירים TimePickerDialog
מהשיטה onCreateDialog()
של קטע הקוד.
הרחבת DialogFragment לבורר זמן
כדי להגדיר DialogFragment
ל-TimePickerDialog
:
- מגדירים את ה-method
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. } }
מידע על הארגומנטים של ה-constructor מופיע בכיתה 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()
במופע חדש של DialogFragment
שהוגדר בדוגמה הקודמת. ה-method show()
דורש מופע של FragmentManager
ושם תג ייחודי למקטע.
יצירת חלונית לבחירת תאריך
יצירת DatePickerDialog
דומה ליצירת TimePickerDialog
. ההבדל הוא בתיבת הדו-שיח שיוצרים לקטע.
כדי להציג DatePickerDialog
באמצעות DialogFragment
, מגדירים סוג של קטע קוד שמרחיב את DialogFragment
ומחזירים DatePickerDialog
מהשיטה onCreateDialog()
של קטע הקוד.
הרחבת 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. } }
מידע על הארגומנטים של ה-constructor זמין במחלקה 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()
במכונה חדשה של DialogFragment
שמוגדרת בדוגמה שלמעלה. כדי להשתמש בשיטה show()
צריך מופע של FragmentManager
ושם תג ייחודי לקטע.
שימוש בבוררי בחירה עם מילוי אוטומטי
בשנת 2017 הושק ב-Android מסגרת המילוי האוטומטי, שמאפשרת למשתמשים לשמור נתונים שאפשר להשתמש בהם כדי למלא טפסים באפליקציות שונות. בוחרי המוצרים יכולים להיות שימושיים בתרחישים של מילוי אוטומטי, כי הם כוללים ממשק משתמש שמאפשר למשתמשים לשנות את הערך של שדה שבו נשמרים נתוני תאריך ושעה. לדוגמה, בטופס של כרטיס אשראי, בורר תאריכים מאפשר למשתמשים להזין או לשנות את תאריך התפוגה של כרטיס האשראי.
בוררי הבחירה הם תיבת דו-שיח, ולכן הם לא מוצגים בפעילות לצד שדות אחרים. כדי להציג את נתוני הבורר כשהבורר לא גלוי, אפשר להשתמש בתצוגה אחרת, כמו EditText
, שיכולה להציג את הערך כשהבורר לא גלוי.
אובייקט EditText
מצפה באופן מקורי לנתוני מילוי אוטומטי מסוג AUTOFILL_TYPE_TEXT
.
לעומת זאת, שירותי מילוי אוטומטי שומרים את הנתונים בתור AUTOFILL_TYPE_DATE
כדי ליצור ייצוג מתאים שלהם. כדי לפתור את חוסר העקביות בסוגים, אנחנו ממליצים ליצור תצוגה בהתאמה אישית שירשה מ-EditText
ולהטמיע את השיטות הנדרשות לטיפול נכון בערכים מסוג AUTOFILL_TYPE_DATE
.
כדי ליצור מחלקה של EditText
שיכולה לטפל בערכים מסוג AUTOFILL_TYPE_DATE
:
- יוצרים כיתה שעוברת בירושה מ-
EditText
. - מטמיעים את השיטה
getAutofillType()
, שמחזירה אתAUTOFILL_TYPE_DATE
. - מטמיעים את השיטה
getAutofillValue()
, שמחזירה אובייקטAutofillValue
שמייצג את התאריך באלפיות השנייה. כדי ליצור את אובייקט ההחזרה, משתמשים ב-methodforDate()
כדי ליצור אובייקטAutofillValue
. - מטמיעים את השיטה
autofill()
. השיטה הזו מספקת את הלוגיקה לטיפול בפרמטרAutofillValue
, שהוא מסוגAUTOFILL_TYPE_DATE
. כדי לטפל בפרמטר, יוצרים ייצוג מחרוזת מתאים שלו, כמוmm/yyyy
. משתמשים בייצוג המחרוזת כדי להגדיר את המאפייןtext
בתצוגה. - הטמעה של פונקציונליות שמציגה בוחר כשהמשתמש רוצה לערוך את התאריך בקטגוריית המשנה המותאמת אישית
EditText
. התצוגה מעדכנת את המאפייןtext
בייצוג מחרוזת של הערך שהמשתמש בחר בבורר.
דוגמה למחלקה משנית של EditText
שמטפלת בערכי AUTOFILL_TYPE_DATE
מופיעה בדוגמה של מסגרת המילוי האוטומטי ב-Java או ב-Kotlin.
למידע נוסף על הוכחת תמיכה במילוי אוטומטי בתצוגות בהתאמה אישית, ראו מסגרת למילוי אוטומטי.