Android cung cấp các tuỳ chọn kiểm soát để người dùng chọn giờ hoặc ngày làm hộp thoại có sẵn. Mỗi bộ chọn cung cấp các tuỳ chọn kiểm soát để chọn giờ (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ữ bộ chọn ngày hoặc giờ. DialogFragment
quản lý vòng đời hộp thoại giúp bạn và
cho phép bạn cung cấp 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 thiết bị cầm tay hoặc dưới dạng phần nhúng của bố cục trên màn hình lớn.
Mặc dù DialogFragment
ban đầu được thêm vào nền tảng trong Android 3.0 (API
cấp 11), nhưng nếu ứng dụng của bạn hỗ trợ các phiên bản Android trước 3.0 — kể cả Android
1.6 — bạn vẫn có thể sử dụng DialogFragment
có trong thư viện hỗ trợ về khả năng tương thích ngược.
Lưu ý: Các mã mẫu dưới đây cho biết cách tạo hộp thoại cho
bộ chọn giờ và bộ chọn ngày bằng các API thư viện hỗ trợ cho DialogFragment
. Nếu minSdkVersion
của ứng dụng là 11
trở lên, bạn có thể sử dụng phiên bản DialogFragment
của nền tảng.
Có các lớp chính như sau:
Ngoài ra, hãy xem bài viết Tổng quan về phân đoạn.
Tạo bộ chọn giờ
Để cho hiện TimePickerDialog
bằng cách sử dụng DialogFragment
, bạn cần xác định lớp phân đoạn giúp mở rộng DialogFragment
và trả về TimePickerDialog
từ phương thức onCreateDialog()
của phân đoạn.
Lưu ý: Nếu ứng dụng của bạn hỗ trợ các phiên bản Android cũ hơn 3.0, hãy nhớ thiết lập dự án Android của bạn bằng thư viện hỗ trợ như mô tả trong phần Thiết lập dự án để sử dụng Thư viện.
Mở rộng hộp thoại để chọn giờ
Để xác định DialogFragment
cho TimePickerDialog
, bạn phải:
- Xác định phương thức
onCreateDialog()
để trả về một phiên bản củaTimePickerDialog
- Triển khai giao diện
TimePickerDialog.OnTimeSetListener
để nhận lệnh gọi lại khi người dùng thiết lập giờ.
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 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 } }
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 thêm một sự kiện, sự kiện này thêm một phiên bản của phân đoạn này vào hoạt động của bạn.
Hiển thị bộ chọn giờ
Sau khi định nghĩa DialogFragment
như ví dụ ở trên,
bạn có thể cho hiện bộ chọn giờ bằng cách tạo một phiên bản của DialogFragment
và gọi show()
.
Ví dụ: sau đây là nút mà khi nhấp vào, hệ thống sẽ gọi một phương thức để hiện hộp thoại:
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/pick_time" android:onClick="showTimePickerDialog" />
Khi người dùng nhấp vào nút này, hệ thống sẽ gọi phương thức sau:
Kotlin
fun showTimePickerDialog(v: View) { TimePickerFragment().show(supportFragmentManager, "timePicker") }
Java
public void showTimePickerDialog(View v) { DialogFragment newFragment = new TimePickerFragment(); newFragment.show(getSupportFragmentManager(), "timePicker"); }
Phương thức này gọi show()
trên một phiên bản mới của DialogFragment
được định nghĩa ở trên. Phương thức show()
yêu cầu một phiên bản của FragmentManager
và tên thẻ duy nhất cho phân đoạn.
Cảnh báo: Nếu ứng dụng của bạn hỗ trợ các phiên bản Android thấp hơn
3.0, hãy nhớ gọi getSupportFragmentManager()
để có được một phiên bản của
FragmentManager
. Đồng thời, hãy đảm bảo rằng hoạt động hiển thị bộ chọn giờ
mở rộng FragmentActivity
thay vì lớp Activity
chuẩn.
Tạo bộ chọn ngày
Cách tạo DatePickerDialog
cũng giống như cách tạo TimePickerDialog
. Điểm khác biệt duy nhất là hộp thoại bạn tạo cho phân đoạn.
Để cho hiện DatePickerDialog
bằng cách sử dụng DialogFragment
, bạn cần xác định lớp phân đoạn giúp mở rộng DialogFragment
và trả về DatePickerDialog
từ phương thức onCreateDialog()
của phân đoạn.
Mở rộng DialogFragment cho bộ chọn ngày
Để xác định DialogFragment
cho DatePickerDialog
, bạn phải:
- Định nghĩa phương thức
onCreateDialog()
để trả về một phiên bản củaDatePickerDialog
- Triển khai giao diện
DatePickerDialog.OnDateSetListener
để nhận lệnh gọi lại khi người dùng thiết lập 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(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 } }
Xem lớp DatePickerDialog
để 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 thêm một sự kiện, sự kiện này thêm một phiên bản của phân đoạn này vào hoạt động của bạn.
Hiển thị bộ chọn ngày
Sau khi định nghĩa DialogFragment
như ví dụ ở trên,
bạn có thể cho hiện bộ chọn ngày bằng cách tạo một phiên bản của DialogFragment
và gọi show()
.
Ví dụ: sau đây là nút mà khi nhấp vào, hệ thống sẽ gọi một phương thức để hiện hộp thoại:
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/pick_date" android:onClick="showDatePickerDialog" />
Khi người dùng nhấp vào nút này, hệ thống sẽ gọi phương thức sau:
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"); }
Phương thức này gọi show()
trên một phiên bản mới của DialogFragment
được định nghĩa ở trên. Phương thức show()
yêu cầu một phiên bản của FragmentManager
và tên thẻ duy nhất cho phân đoạn.
Sử dụng bộ chọn bằng tính năng tự động điền
Android 8.0 giới thiệu Khung tự động điền, cho phép người dùng lưu dữ liệu mà sau này có thể dùng để điền vào biểu mẫu trong các ứng dụng. Bộ chọn rất hữu ích trong các tình huống cần tự động điền, vì công cụ này 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 sẽ cho phép người dùng nhập hoặc thay đổi ngày hết hạn thẻ tín dụng của họ.
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 hiện dữ liệu bộ chọn khi bộ chọn không xuất hiện, bạn có thể
sử dụng một thành phần hiển thị khác, chẳng hạn như EditText
để cho thấy
giá trị khi bộ chọn không xuất hiện.
Đối tượng EditText
gốc dự kiến 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 phải lưu dữ liệu dưới dạng AUTOFILL_TYPE_DATE
để
có thể tạo cách biểu thị phù hợp. Để giải quyết việc các loại dữ liệu không nhất quán, bạn nên tạo thành phần 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
.
Bạn nên thực hiện 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 phù hợp biểu thị tham số đó, chẳng hạn nhưmm/yyyy
. Sử dụng cách biểu thị dạng chuỗi để thiết lập thuộc tínhtext
của thành phần 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
. Thành phần hiển thị này sẽ cập nhật thuộc tínhtext
bằng một chuỗi biểu thị giá trị mà người dùng đã chọn trên bộ chọn.
Để biết ví dụ về lớp con của EditText
có nhiệm vụ xử lý các giá trị
AUTOFILL_TYPE_DATE
, hãy xem
mẫu về Khung tự động điền trên Java |
Kotlin.
Để tìm hiểu thêm về cách hỗ trợ tính năng tự động điền cho thành phần hiển thị tuỳ chỉnh, hãy xem bài viết Hỗ trợ cho thành phần hiển thị tuỳ chỉnh.