Menambahkan alat pilih ke aplikasi

Android menyediakan kontrol bagi pengguna untuk memilih waktu atau tanggal dialog siap pakai. Alat pilih ini menyediakan kontrol untuk memilih masing-masing bagian waktu (jam, menit, AM/PM) atau tanggal (bulan, hari, tahun).

Contoh alat pilih waktu dari material.io
Gambar 1. Pilihan jam di pemilih kalender seluler.

Menggunakan alat pilih ini membantu memastikan bahwa pengguna dapat memilih waktu atau tanggal.yang valid, diformat dengan benar, dan disesuaikan dengan bahasa lokal pengguna.

Contoh pemilih tanggal modal dari material.io
Gambar 2. Pemilih tanggal modal.

Sebaiknya gunakan DialogFragment untuk menghosting setiap pemilih waktu atau tanggal. DialogFragment mengelola siklus proses dialog untuk Anda dan memungkinkan Anda menampilkan pemilih dalam tata letak yang berbeda konfigurasi dasar, seperti pada dialog dasar pada handset atau sebagai bagian yang tata letak pada perangkat layar besar.

Membuat pemilih waktu

Untuk menampilkan TimePickerDialog dengan menggunakan DialogFragment, tentukan class fragmen yang memperluas DialogFragment dan tampilkan TimePickerDialog dari fungsi fragmen onCreateDialog() .

Memperluas DialogFragment untuk pemilih waktu

Untuk menentukan DialogFragment untuk TimePickerDialog, lakukan hal berikut:

  • Tentukan metode onCreateDialog() untuk menampilkan instance TimePickerDialog.
  • Implementasikan TimePickerDialog.OnTimeSetListener untuk menerima callback saat pengguna menyetel waktu.

Berikut contohnya:

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.
    }
}

Lihat class TimePickerDialog untuk mengetahui informasi tentang argumen konstruktor.

Sekarang Anda hanya perlu peristiwa yang menambahkan instance fragmen ini ke aktivitas Anda.

Menampilkan alat pilih waktu

Setelah Anda menentukan DialogFragment seperti yang ada di atas Anda dapat menampilkan pemilih waktu dengan membuat instance DialogFragment dan memanggil show() .

Misalnya, berikut adalah tombol yang, saat diketuk, memanggil metode untuk menampilkan dialog:

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

Jika pengguna mengetuk tombol ini, sistem akan memanggil metode berikut:

Kotlin

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

Java

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

Metode ini memanggil show() pada instance baru DialogFragment ditentukan dalam contoh sebelumnya. Tujuan Metode show() memerlukan instance FragmentManager dan nama tag yang unik untuk fragmen tersebut.

Membuat pemilih tanggal

Membuat DatePickerDialog seperti membuat TimePickerDialog. Perbedaannya adalah dialog yang Anda buat untuk fragmen.

Untuk menampilkan DatePickerDialog menggunakan DialogFragment, tentukan class fragmen yang memperluas DialogFragment dan menampilkan DatePickerDialog dari onCreateDialog() fragmen .

Memperluas DialogFragment untuk pemilih tanggal

Untuk menentukan DialogFragment untuk DatePickerDialog, lakukan hal berikut:

  • Tentukan metode onCreateDialog() untuk menampilkan instance DatePickerDialog.
  • Implementasikan DatePickerDialog.OnDateSetListener untuk menerima callback saat pengguna menyetel tanggal.

Berikut contohnya:

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.
    }
}

Lihat DatePickerDialog untuk informasi tentang argumen konstruktor.

Anda hanya perlu peristiwa yang menambahkan instance fragmen ini ke aktivitas Anda.

Menampilkan pemilih tanggal

Setelah Anda menentukan DialogFragment seperti contoh sebelumnya, Anda dapat menampilkan pemilih tanggal dengan membuat instance DialogFragment dan memanggil show().

Misalnya, berikut adalah tombol yang, saat diketuk, memanggil metode untuk menampilkan dialog:

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

Jika pengguna mengetuk tombol ini, sistem akan memanggil metode berikut:

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");
}

Metode ini memanggil show() pada instance baru DialogFragment ditentukan dalam contoh sebelumnya. Tujuan Metode show() memerlukan instance FragmentManager dan nama tag yang unik untuk fragmen tersebut.

Menggunakan alat pilih dengan isi otomatis

Pada tahun 2017, Android memperkenalkan Framework isi otomatis, yang memungkinkan pengguna menyimpan data yang dapat digunakan untuk mengisi formulir di berbagai aplikasi. Alat pilih dapat berguna dalam skenario isi otomatis dengan menyediakan UI yang memungkinkan pengguna mengubah nilai dari {i>field<i} yang menyimpan data tanggal atau waktu. Misalnya, di kartu kredit formulir, pemilih tanggal memungkinkan pengguna memasukkan atau mengubah tanggal habis masa berlaku kartu kredit.

Karena berbentuk dialog, alat pilih tidak ditampilkan dalam aktivitas beserta kolom lainnya. Untuk menampilkan data pemilih saat alat pilih tidak terlihat, Anda dapat menggunakan tampilan lain, seperti EditText, yang dapat menampilkan nilai saat pemilih tidak terlihat.

Objek EditText secara native mengharapkan data isi otomatis jenis AUTOFILL_TYPE_TEXT. Sebaliknya, layanan {i>autofill <i}menyimpan data sebagai AUTOFILL_TYPE_DATE untuk membuat representasi yang tepat. Untuk mengatasi inkonsistensi dalam yang sama, sebaiknya Anda membuat tampilan kustom yang mewarisi EditText dan mengimplementasikan metode yang diperlukan untuk menangani dengan benar nilai dari jenis AUTOFILL_TYPE_DATE.

Lakukan langkah-langkah berikut untuk membuat subclass EditText yang dapat menangani nilai jenis AUTOFILL_TYPE_DATE:

  1. Buat class yang mewarisi EditText.
  2. Implementasikan getAutofillType() , yang menampilkan AUTOFILL_TYPE_DATE.
  3. Implementasikan getAutofillValue() , yang mengembalikan nilai AutofillValue yang mewakili tanggal dalam milidetik. Untuk membuat return , gunakan forDate() untuk menghasilkan objek AutofillValue.
  4. Implementasikan autofill() . Metode ini menyediakan logika untuk menangani Parameter AutofillValue, yang berjenis AUTOFILL_TYPE_DATE. Untuk menangani parameter tersebut, buat atribut yang mewakili string tersebut, seperti mm/yyyy. Menggunakan string untuk menetapkan properti text tampilan Anda.
  5. Terapkan fungsionalitas yang menampilkan alat pilih saat pengguna ingin mengedit tanggal di subclass kustom EditText. Tampilan akan diperbarui properti text dengan representasi string dari nilai yang dipilih pengguna pada pemilih.

Untuk contoh subclass EditText yang menangani Nilai AUTOFILL_TYPE_DATE, lihat contoh Framework Isi Otomatis di Java atau Kotlin

Untuk mempelajari lebih lanjut cara membuktikan dukungan isi otomatis untuk tampilan kustom Anda, lihat Framework isi otomatis.