Menambahkan langkah yang dipandu

Membangun aplikasi dengan lebih baik menggunakan Compose
Membuat UI yang menarik dengan kode minimal menggunakan Jetpack Compose untuk Android TV OS.

Aplikasi Anda mungkin memiliki tugas multi-langkah untuk pengguna. Misalnya, aplikasi Anda mungkin perlu memandu pengguna dalam membeli konten tambahan, menyiapkan setelan konfigurasi yang kompleks, atau cukup mengonfirmasi keputusan. Semua tugas ini mengharuskan pengguna untuk melalui satu atau beberapa langkah atau keputusan yang berurutan.

Library androidx.Lean menyediakan class untuk mengimplementasikan tugas pengguna multi-langkah. Halaman ini membahas cara menggunakan class GuidedStepSupportFragment untuk memandu pengguna melalui serangkaian keputusan dalam menyelesaikan tugas. GuidedStepSupportFragment menggunakan praktik terbaik UI TV untuk memudahkan Anda memahami dan menavigasi tugas multi-langkah di perangkat TV.

Memberikan detail untuk sebuah langkah

GuidedStepSupportFragment mewakili satu langkah dalam serangkaian langkah. Secara visual, model ini memberikan tampilan panduan dengan daftar kemungkinan tindakan atau keputusan untuk langkah tersebut.

Gambar 1. Contoh langkah terpandu.

Untuk setiap langkah dalam tugas multi-langkah, perluas GuidedStepSupportFragment dan berikan informasi konteks tentang langkah itu dan tindakan yang dapat dilakukan pengguna. Ganti onCreateGuidance() dan tampilkan GuidanceStylist.Guidance baru yang berisi informasi konteks, seperti judul, deskripsi, dan ikon langkah, seperti ditunjukkan dalam contoh berikut:

Kotlin

override fun onCreateGuidance(savedInstanceState: Bundle?): GuidanceStylist.Guidance {
    return GuidanceStylist.Guidance(
            getString(R.string.guidedstep_first_title),
            getString(R.string.guidedstep_first_description),
            getString(R.string.guidedstep_first_breadcrumb),
            activity.getDrawable(R.drawable.guidedstep_main_icon_1)
    )
}

Java

@Override
public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
    String title = getString(R.string.guidedstep_first_title);
    String breadcrumb = getString(R.string.guidedstep_first_breadcrumb);
    String description = getString(R.string.guidedstep_first_description);
    Drawable icon = getActivity().getDrawable(R.drawable.guidedstep_main_icon_1);
    return new GuidanceStylist.Guidance(title, description, breadcrumb, icon);
}

Tambahkan subclass GuidedStepSupportFragment ke aktivitas yang Anda inginkan dengan memanggil GuidedStepSupportFragment.add() dalam metode onCreate() aktivitas Anda.

Jika aktivitas Anda hanya berisi objek GuidedStepSupportFragment, gunakan GuidedStepSupportFragment.addAsRoot(), bukan add(), untuk menambahkan GuidedStepSupportFragment yang pertama. Menggunakan addAsRoot() membantu memastikan bahwa jika pengguna menekan tombol Kembali di remote TV saat melihat GuidedStepSupportFragment pertama, GuidedStepSupportFragment dan aktivitas induk akan tertutup.

Catatan: Tambahkan objek GuidedStepSupportFragment secara terprogram, bukan dalam file XML tata letak Anda.

Membuat dan menangani tindakan pengguna

Tambahkan tindakan pengguna dengan mengganti onCreateActions(). Dalam penggantian, tambahkan GuidedAction baru untuk setiap item tindakan dan berikan string tindakan, deskripsi, serta ID. Gunakan GuidedAction.Builder untuk menambahkan tindakan baru.

Kotlin

override fun onCreateActions(actions: MutableList<GuidedAction>, savedInstanceState: Bundle?) {
    super.onCreateActions(actions, savedInstanceState)

    // Add "Continue" user action for this step
    actions.add(GuidedAction.Builder()
            .id(CONTINUE)
            .title(getString(R.string.guidedstep_continue))
            .description(getString(R.string.guidedstep_letsdoit))
            .hasNext(true)
            .build())
    ...

Java

@Override
public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
    // Add "Continue" user action for this step
    actions.add(new GuidedAction.Builder()
           .id(CONTINUE)
           .title(getString(R.string.guidedstep_continue))
           .description(getString(R.string.guidedstep_letsdoit))
           .hasNext(true)
           .build());
...

Tindakan tidak terbatas pada pilihan baris tunggal. Berikut adalah jenis tindakan tambahan yang dapat Anda buat:

  • Tambahkan tindakan label informasi untuk memberikan informasi tambahan tentang pilihan pengguna dengan menetapkan infoOnly(true). Jika infoOnly bernilai benar (true), pengguna tidak dapat memilih tindakan.
  • Tambahkan tindakan teks yang dapat diedit dengan menyetel editable(true). Jika editable bernilai benar, pengguna dapat memasukkan teks dalam tindakan yang dipilih menggunakan remote atau keyboard yang terhubung. Ganti onGuidedActionEditedAndProceed() untuk mendapatkan teks yang dimodifikasi yang dimasukkan pengguna. Anda juga dapat mengganti onGuidedActionEditCanceled() untuk mengetahui kapan pengguna membatalkan input.
  • Tambahkan kumpulan tindakan yang berperilaku seperti tombol pilihan yang dapat dicentang menggunakan checkSetId() dengan nilai ID umum untuk mengelompokkan tindakan ke dalam sebuah set. Semua tindakan dalam daftar yang sama dengan ID check-set yang sama dianggap tertaut. Saat pengguna memilih salah satu tindakan dalam kumpulan tersebut, tindakan tersebut akan dicentang dan semua tindakan lainnya menjadi tidak dicentang.
  • Tambahkan tindakan pemilih tanggal menggunakan GuidedDatePickerAction.Builder, bukan GuidedAction.Builder di onCreateActions(). Ganti onGuidedActionEditedAndProceed() untuk mendapatkan nilai tanggal yang diubah yang dimasukkan pengguna.
  • Tambahkan tindakan yang menggunakan subtindakan untuk memungkinkan pengguna memilih dari daftar pilihan yang diperluas. Subtindakan dijelaskan di bagian Menambahkan subtindakan.
  • Tambahkan tindakan tombol yang muncul di sebelah kanan daftar tindakan dan yang mudah diakses. Tindakan tombol dijelaskan di bagian Menambahkan tindakan tombol.

Anda juga dapat menambahkan indikator visual bahwa memilih tindakan akan menghasilkan langkah baru dengan menetapkan hasNext(true).

Untuk berbagai atribut yang dapat Anda tetapkan, lihat GuidedAction.

Untuk merespons tindakan, ganti onGuidedActionClicked() dan proses GuidedAction yang diteruskan. Identifikasi tindakan yang dipilih dengan memeriksa GuidedAction.getId().

Menambahkan subtindakan

Beberapa tindakan mungkin mengharuskan Anda memberi pengguna serangkaian pilihan tambahan. GuidedAction dapat menentukan daftar subtindakan yang ditampilkan sebagai menu tindakan turunan.

Gambar 2. Subtindakan langkah terpandu.

Daftar subtindakan dapat berisi tindakan reguler atau tindakan tombol pilihan, tetapi bukan tindakan pemilih tanggal atau tindakan teks yang dapat diedit. Selain itu, subtindakan tidak dapat memiliki kumpulan subtindakan sendiri karena sistem tidak mendukung lebih dari satu tingkat subtindakan.

Untuk menambahkan subtindakan, pertama-tama buat dan isi daftar objek GuidedAction yang berfungsi sebagai subtindakan, seperti yang ditunjukkan dalam contoh berikut:

Kotlin

subActions.add(GuidedAction.Builder()
        .id(SUBACTION1)
        .title(getString(R.string.guidedstep_subaction1_title))
        .description(getString(R.string.guidedstep_subaction1_desc))
        .build())
...

Java

List<GuidedAction> subActions = new ArrayList<GuidedAction>();
subActions.add(new GuidedAction.Builder()
       .id(SUBACTION1)
       .title(getString(R.string.guidedstep_subaction1_title))
       .description(getString(R.string.guidedstep_subaction1_desc))
       .build());
...

Di onCreateActions(), buat GuidedAction level teratas yang menampilkan daftar subtindakan saat dipilih:

Kotlin

    ...
    actions.add(GuidedAction.Builder()
            .id(SUBACTIONS)
            .title(getString(R.string.guidedstep_subactions_title))
            .description(getString(R.string.guidedstep_subactions_desc))
            .subActions(subActions)
            .build())
    ...

Java

@Override
public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
...
    actions.add(new GuidedAction.Builder()
           .id(SUBACTIONS)
           .title(getString(R.string.guidedstep_subactions_title))
           .description(getString(R.string.guidedstep_subactions_desc))
           .subActions(subActions)
           .build());
...
}

Terakhir, respons pilihan subtindakan dengan mengganti onSubGuidedActionClicked():

Kotlin

override fun onSubGuidedActionClicked(action: GuidedAction): Boolean {
    // Check for which action was clicked and handle as needed
    when(action.id) {
        SUBACTION1 -> {
            // Subaction 1 selected
        }
    }
    // Return true to collapse the subactions menu or
    // false to keep the menu expanded
    return true
}

Java

@Override
public boolean onSubGuidedActionClicked(GuidedAction action) {
   // Check for which action was clicked and handle as needed
   if (action.getId() == SUBACTION1) {
       // Subaction 1 selected
   }
   // Return true to collapse the subactions menu or
   // false to keep the menu expanded
   return true;
}

Menambahkan tindakan tombol

Jika langkah terpandu Anda memiliki daftar besar tindakan, pengguna mungkin harus men-scroll daftar untuk mengakses tindakan yang paling umum digunakan. Gunakan tindakan tombol untuk memisahkan tindakan yang biasa digunakan dari daftar tindakan. Tindakan tombol akan muncul di samping daftar tindakan dan mudah dibuka.

Gambar 3. Tindakan tombol langkah terpandu.

Tindakan tombol dibuat dan ditangani seperti halnya tindakan biasa, tetapi pembuatannya dilakukan di onCreateButtonActions(), bukan di onCreateActions(). Respons tindakan tombol di onGuidedActionClicked().

Gunakan tindakan tombol untuk tindakan sederhana, seperti tindakan navigasi antar-langkah. Jangan gunakan tindakan pemilih tanggal atau tindakan yang dapat diedit lainnya sebagai tindakan tombol. Selain itu, tindakan tombol tidak dapat memiliki subtindakan.

Mengelompokkan langkah terpandu ke dalam urutan

GuidedStepSupportFragment mewakili satu langkah. Untuk membuat urutan langkah yang berurutan, kelompokkan beberapa objek GuidedStepSupportFragment bersama-sama menggunakan GuidedStepSupportFragment.add() untuk menambahkan langkah berikutnya dalam urutan ke tumpukan fragmen.

Kotlin

override fun onGuidedActionClicked(action: GuidedAction) {
    val fm = fragmentManager
    when(action.id) {
        CONTINUE -> GuidedStepSupportFragment.add(fm, SecondStepFragment())
    }
}

Java

@Override
public void onGuidedActionClicked(GuidedAction action) {
    FragmentManager fm = getFragmentManager();
    if (action.getId() == CONTINUE) {
       GuidedStepSupportFragment.add(fm, new SecondStepFragment());
    }
...

Jika pengguna menekan tombol Kembali pada remote TV, perangkat akan menampilkan GuidedStepSupportFragment sebelumnya di tumpukan fragmen. Jika Anda memberikan GuidedAction Anda sendiri yang kembali ke langkah sebelumnya, Anda dapat mengimplementasikan perilaku Kembali dengan memanggil getFragmentManager().popBackStack(). Jika perlu mengembalikan pengguna ke langkah yang lebih awal lagi dalam urutan, gunakan popBackStackToGuidedStepSupportFragment() untuk kembali ke GuidedStepSupportFragment spesifik dalam tumpukan fragmen.

Setelah pengguna menyelesaikan langkah terakhir dalam urutan, gunakan finishGuidedStepSupportFragments() untuk menghapus semua instance GuidedStepSupportFragment dari tumpukan saat ini dan kembali ke aktivitas induk awal. Jika GuidedStepSupportFragment pertama ditambahkan menggunakan addAsRoot(), memanggil finishGuidedStepSupportFragments() juga akan menutup aktivitas induk.

Menyesuaikan presentasi langkah

Class GuidedStepSupportFragment dapat menggunakan tema kustom yang mengontrol aspek presentasi seperti pemformatan teks judul atau animasi transisi langkah. Tema kustom harus mewarisi dari Theme_Leanback_GuidedStep dan dapat memberikan nilai pengganti untuk atribut yang ditentukan dalam GuidanceStylist dan GuidedActionsStylist.

Untuk menerapkan tema kustom ke GuidedStepSupportFragment, lakukan salah satu langkah berikut:

  • Terapkan tema ke aktivitas induk dengan menetapkan atribut android:theme ke elemen aktivitas dalam manifes Android. Menetapkan atribut ini akan menerapkan tema ke semua tampilan turunan dan merupakan cara paling mudah untuk menerapkan tema kustom jika aktivitas induk hanya berisi objek GuidedStepSupportFragment.
  • Jika aktivitas sudah menggunakan tema kustom dan Anda tidak ingin menerapkan gaya GuidedStepSupportFragment ke tampilan lain dalam aktivitas tersebut, tambahkan atribut LeanbackGuidedStepTheme_guidedStepTheme ke tema aktivitas kustom yang ada. Atribut ini mengarah ke tema kustom yang hanya objek GuidedStepSupportFragment dalam penggunaan aktivitas Anda.
  • Jika Anda menggunakan objek GuidedStepSupportFragment dalam berbagai aktivitas yang merupakan bagian dari keseluruhan tugas multi-langkah yang sama dan ingin menggunakan tema visual yang konsisten di semua langkah, ganti GuidedStepSupportFragment.onProvideTheme() dan tampilkan tema kustom Anda.

Untuk informasi selengkapnya tentang cara menambahkan gaya dan tema, lihat Gaya dan Tema.

Class GuidedStepSupportFragment menggunakan class penata gaya khusus untuk mengakses dan menerapkan atribut tema. Class GuidanceStylist menggunakan informasi tema untuk mengontrol presentasi tampilan panduan sebelah kiri, sedangkan class GuidedActionsStylist menggunakan informasi tema untuk mengontrol presentasi tampilan tindakan sebelah kanan.

Untuk menyesuaikan gaya visual langkah-langkah Anda di luar yang disediakan oleh penyesuaian tema, buat subclass GuidanceStylist atau GuidedActionsStylist, dan tampilkan subclass Anda di GuidedStepSupportFragment.onCreateGuidanceStylist() atau GuidedStepSupportFragment.onCreateActionsStylist(). Untuk mengetahui detail tentang hal yang dapat Anda sesuaikan dalam subclass ini, lihat dokumentasi di GuidanceStylist dan GuidedActionsStylist.