Android cung cấp các chế độ điều khiển để người dùng chọn ngày hoặc giờ làm hộp thoại sẵn sàng sử dụng. Các bộ chọn này cung cấp các tuỳ chọn kiểm soát để chọn từng phần của thời gian (giờ, phút, sáng/chiều) hoặc ngày (tháng, ngày, năm).
Việc sử dụng những bộ chọn này sẽ giúp đảm bảo rằng người dùng của bạn có thể chọn ngày hoặc giờ hợp lệ, có định dạng chính xác và được điều chỉnh theo ngôn ngữ của người dùng.
Bạn nên sử dụng DialogFragment
để lưu trữ mỗi bộ chọn ngày hoặc giờ. DialogFragment
quản lý vòng đời hộp thoại cho bạn và cho phép bạn hiển thị bộ chọn ở nhiều cấu hình bố cục, chẳng hạn như trong hộp thoại cơ bản trên điện thoại di động hoặc dưới dạng một phần nhúng của bố cục trên màn hình lớn.
Tạo bộ chọn giờ
Để hiển thị TimePickerDialog
bằng DialogFragment
, hãy xác định một lớp mảnh mở rộng DialogFragment
và trả về TimePickerDialog
từ phương thức onCreateDialog()
của mảnh.
Mở rộng DialogFragment cho bộ chọn giờ
Để xác định DialogFragment
cho TimePickerDialog
, hãy làm như sau:
- Định nghĩa phương thức
onCreateDialog()
để trả về một thực thể củaTimePickerDialog
. - Hãy triển khai giao diện
TimePickerDialog.OnTimeSetListener
để nhận lệnh gọi lại khi người dùng đặt thời gian.
Ví dụ:
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. } }
Hãy xem lớp TimePickerDialog
để biết thông tin về các đối số của hàm khởi tạo.
Bây giờ, bạn chỉ cần một sự kiện thêm một thực thể của mảnh này vào hoạt động của mình.
Hiện bộ chọn giờ
Sau khi xác định DialogFragment
như ví dụ trước, bạn có thể hiển thị bộ chọn giờ bằng cách tạo một thực thể của DialogFragment
và gọi phương thức show()
.
Ví dụ: dưới đây là nút mà khi người dùng nhấn vào, nút này sẽ gọi một phương thức để hiện hộp thoại:
<Button android:id="@+id/pickTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Pick time" />
Khi người dùng nhấn vào nút này, hệ thống sẽ gọi phương thức sau:
Kotlin
findViewById<Button>(R.id.pickTime).setOnClickListener { TimePickerFragment().show(supportFragmentManager, "timePicker") }
Java
findViewById<Button>(R.id.pickTime).setOnClickListener { TimePickerFragment().show(supportFragmentManager, "timePicker"); }
Phương thức này gọi show()
trên một thực thể mới của DialogFragment
được xác định trong ví dụ trước. Phương thức show()
yêu cầu một bản sao của FragmentManager
và tên thẻ duy nhất cho phân đoạn.
Tạo bộ chọn ngày
Việc tạo DatePickerDialog
cũng giống như việc tạo TimePickerDialog
. Điểm khác biệt là hộp thoại
bạn tạo cho mảnh.
Để hiển thị DatePickerDialog
bằng DialogFragment
, hãy xác định lớp mảnh mở rộng DialogFragment
và trả về DatePickerDialog
từ phương thức onCreateDialog()
của mảnh.
Mở rộng DialogFragment cho bộ chọn ngày
Để xác định DialogFragment
cho DatePickerDialog
, hãy làm như sau:
- Định nghĩa phương thức
onCreateDialog()
để trả về một thực thể củaDatePickerDialog
. - Hãy triển khai giao diện
DatePickerDialog.OnDateSetListener
để nhận lệnh gọi lại khi người dùng đặt ngày.
Ví dụ:
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. } }
Hãy xem lớp DatePickerDialog
để biết thông tin về các đối số của hàm khởi tạo.
Bạn chỉ cần một sự kiện thêm một thực thể của mảnh này vào hoạt động của mình.
Hiển thị bộ chọn ngày
Sau khi xác định DialogFragment
như ví dụ trước, bạn có thể hiển thị bộ chọn ngày bằng cách tạo một thực thể của DialogFragment
và gọi show()
.
Ví dụ: dưới đây là nút mà khi người dùng nhấn vào, nút này sẽ gọi một phương thức để hiện hộp thoại:
<Button android:id="@+id/pickDate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Pick date"/>
Khi người dùng nhấn vào nút này, hệ thống sẽ gọi phương thức sau:
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"); }
Phương thức này gọi show()
trên một thực thể mới của DialogFragment
được xác định trong ví dụ trước. Phương thức show()
yêu cầu một bản sao của FragmentManager
và tên thẻ duy nhất cho phân đoạn.
Sử dụng bộ chọn có tính năng tự động điền
Năm 2017, Android ra mắt Khung tự động điền, cho phép người dùng lưu dữ liệu có thể dùng để điền vào biểu mẫu trong các ứng dụng. Bộ chọn có thể hữu ích trong các trường hợp tự động điền do cung cấp một giao diện người dùng cho phép người dùng thay đổi giá trị của trường lưu trữ dữ liệu ngày hoặc giờ. Ví dụ: trong biểu mẫu thẻ tín dụng, bộ chọn ngày cho phép người dùng nhập hoặc thay đổi ngày hết hạn của thẻ tín dụng.
Vì bộ chọn là hộp thoại nên sẽ không xuất hiện trong một hoạt động cùng với
các trường khác. Để cho thấy dữ liệu bộ chọn khi bộ chọn không xuất hiện, bạn có thể dùng một khung hiển thị khác, chẳng hạn như EditText
. Khung hiển thị này có thể cho thấy giá trị khi bộ chọn không xuất hiện.
Theo dự kiến ban đầu, đối tượng EditText
sẽ có dữ liệu tự động điền thuộc loại AUTOFILL_TYPE_TEXT
.
Ngược lại, các dịch vụ tự động điền sẽ lưu dữ liệu dưới dạng AUTOFILL_TYPE_DATE
để tạo cách trình bày phù hợp. Để giải quyết sự không nhất quán về kiểu dữ liệu, bạn nên tạo khung hiển thị tuỳ chỉnh kế thừa từ EditText
và triển khai các phương thức cần thiết để xử lý chính xác các giá trị thuộc loại AUTOFILL_TYPE_DATE
.
Hãy làm theo các bước sau để tạo một lớp con của EditText
có thể xử lý các giá trị thuộc loại AUTOFILL_TYPE_DATE
:
- Tạo lớp kế thừa từ
EditText
. - Triển khai phương thức
getAutofillType()
. Phương thức này sẽ trả vềAUTOFILL_TYPE_DATE
. - Triển khai phương thức
getAutofillValue()
. Phương thức này sẽ trả về một đối tượngAutofillValue
biểu thị ngày theo mili giây. Để tạo đối tượng trả về, hãy sử dụng phương thứcforDate()
để tạo đối tượngAutofillValue
. - Triển khai phương thức
autofill()
. Phương thức này cung cấp logic để xử lý tham sốAutofillValue
thuộc loạiAUTOFILL_TYPE_DATE
. Để xử lý tham số này, hãy tạo một chuỗi thích hợp đại diện cho tham số đó, chẳng hạn nhưmm/yyyy
. Sử dụng cách biểu diễn dạng chuỗi để đặt thuộc tínhtext
của khung hiển thị. - Triển khai chức năng hiển thị bộ chọn khi người dùng muốn chỉnh sửa ngày trong lớp con tuỳ chỉnh của
EditText
. Khung hiển thị này sẽ cập nhật thuộc tínhtext
bằng một chuỗi đại diện cho giá trị mà người dùng chọn trên bộ chọn.
Để xem ví dụ về một lớp con của EditText
xử lý các giá trị AUTOFILL_TYPE_DATE
, hãy xem mẫu Khung tự động điền trong Java hoặc Kotlin.
Để tìm hiểu thêm về cách chứng minh khả năng hỗ trợ tính năng tự động điền cho thành phần hiển thị tuỳ chỉnh, hãy xem nội dung Khung tự động điền.