Google berkomitmen untuk mendorong terwujudnya keadilan rasial bagi komunitas Kulit Hitam. Lihat caranya.

Memperkenalkan pengguna pemula ke aplikasi Anda

Untuk menunjukkan cara mengoptimalkan aplikasi Anda kepada pengguna pemula, berikan informasi orientasi saat aplikasi dimulai. Berikut ini beberapa contoh informasi orientasi:

  • Menampilkan informasi mendetail tentang saluran yang tersedia saat pengguna mengakses aplikasi saluran untuk pertama kalinya.
  • Menarik perhatian pengguna ke fitur-fitur penting dalam aplikasi Anda.
  • Ilustrasikan langkah-langkah wajib atau yang direkomendasikan untuk dilakukan pengguna saat pertama kali menggunakan aplikasi.

Library Androidx Leanback menyediakan class OnboardingSupportFragment untuk menyajikan informasi pengguna pertama kali. Tutorial ini menjelaskan cara menggunakan class OnboardingSupportFragment untuk memberikan informasi pengantar yang ditampilkan saat aplikasi diluncurkan pertama kalinya. OnboardingSupportFragment menggunakan praktik terbaik UI TV untuk memberikan informasi dengan cara yang cocok dengan gaya UI TV, dan mudah dinavigasi di perangkat TV.

Gambar 1. Contoh OnboardingSupportFragment.

OnboardingSupportFragment Anda tidak boleh berisi elemen UI yang memerlukan masukan pengguna, seperti tombol dan kolom. Demikian pula, class tersebut tidak boleh digunakan sebagai elemen UI untuk tugas yang dilakukan pengguna secara rutin. Jika Anda perlu memberikan UI multi-halaman yang memerlukan masukan pengguna, pertimbangkan untuk menggunakan GuidedStepSupportFragment.

Menambahkan OnboardingSupportFragment

Untuk menambahkan OnboardingSupportFragment ke aplikasi Anda, implementasikan class yang memperluas class OnboardingSupportFragment. Tambahkan fragmen ini ke sebuah aktivitas, baik melalui XML tata letak aktivitas atau secara terprogram. Pastikan aktivitas atau fragmen menggunakan tema yang berasal dari Theme_Leanback_Onboarding, seperti yang dijelaskan dalam Menyesuaikan tema.

Dalam metode onCreate() dari aktivitas utama aplikasi Anda, panggil startActivity() dengan Intent yang mengarah ke aktivitas induk OnboardingSupportFragment's Anda. Hal ini memastikan OnboardingSupportFragment Anda muncul segera setelah aplikasi dimulai.

Untuk memastikan bahwa OnboardingSupportFragment hanya muncul pada kali pertama pengguna memulai aplikasi Anda, gunakan objek SharedPreferences untuk melacak bahwa pengguna telah melihat OnboardingSupportFragment. Tentukan nilai boolean yang berubah menjadi true setelah pengguna melihat OnboardingSupportFragment. Periksa nilai ini di onCreate() aktivitas utama Anda, dan hanya mulai aktivitas induk OnboardingSupportFragment jika bernilai false. Contoh berikut menunjukkan penggantian onCreate() yang memeriksa nilai SharedPreferences dan, jika tidak ditetapkan ke true, akan memanggil startActivity() untuk menampilkan OnboardingSupportFragment:

Kotlin

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        PreferenceManager.getDefaultSharedPreferences(this).apply {
            // Check if we need to display our OnboardingSupportFragment
            if (!getBoolean(MyOnboardingSupportFragment.COMPLETED_ONBOARDING_PREF_NAME, false)) {
                // The user hasn't seen the OnboardingSupportFragment yet, so show it
                startActivity(Intent(this@OnboardingActivity, OnboardingActivity::class.java))
            }
        }
    }
    

Java

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SharedPreferences sharedPreferences =
                PreferenceManager.getDefaultSharedPreferences(this);
        // Check if we need to display our OnboardingSupportFragment
        if (!sharedPreferences.getBoolean(
                MyOnboardingSupportFragment.COMPLETED_ONBOARDING_PREF_NAME, false)) {
            // The user hasn't seen the OnboardingSupportFragment yet, so show it
            startActivity(new Intent(this, OnboardingActivity.class));
        }
    }
    

Setelah pengguna melihat OnboardingSupportFragment, tandai sebagai telah dilihat menggunakan objek SharedPreferences. Untuk melakukannya, ganti onFinishFragment() pada OnboardingSupportFragment Anda, dan tetapkan nilai SharedPreferences ke true seperti ditunjukkan dalam contoh berikut:

Kotlin

    override fun onFinishFragment() {
        super.onFinishFragment()
        // User has seen OnboardingSupportFragment, so mark our SharedPreferences
        // flag as completed so that we don't show our OnboardingSupportFragment
        // the next time the user launches the app.
        PreferenceManager.getDefaultSharedPreferences(context).edit().apply {
            putBoolean(COMPLETED_ONBOARDING_PREF_NAME, true)
            apply()
        }
    }
    

Java

    @Override
    protected void onFinishFragment() {
        super.onFinishFragment();
        // User has seen OnboardingSupportFragment, so mark our SharedPreferences
        // flag as completed so that we don't show our OnboardingSupportFragment
        // the next time the user launches the app.
        SharedPreferences.Editor sharedPreferencesEditor =
                PreferenceManager.getDefaultSharedPreferences(getContext()).edit();
        sharedPreferencesEditor.putBoolean(
                COMPLETED_ONBOARDING_PREF_NAME, true);
        sharedPreferencesEditor.apply();
    }
    

Menambahkan halaman OnboardingSupportFragment

Setelah menambahkan OnboardingSupportFragment, Anda harus menentukan halaman orientasi. OnboardingSupportFragment menampilkan konten dalam serangkaian halaman yang diurutkan. Setiap halaman dapat memiliki sebuah judul, deskripsi, dan beberapa subtampilan yang dapat berisi gambar atau animasi.

Gambar 2. Elemen halaman OnboardingSupportFragment.

Gambar 2 menunjukkan halaman contoh dengan info yang menandai elemen halaman yang dapat diubah, dan dapat disediakan OnboardingSupportFragment Anda. Elemen halaman tersebut adalah:

  1. Judul halaman.
  2. Deskripsi halaman.
  3. Tampilan konten halaman, dalam hal ini tanda centang hijau sederhana dalam kotak abu-abu. Tampilan ini bersifat opsional. Gunakan tampilan ini untuk mengilustrasikan detail halaman seperti screenshot yang menyoroti fitur aplikasi yang dijelaskan halaman.
  4. Tampilan latar belakang halaman, dalam hal ini gradien warna biru sederhana. Tampilan ini selalu dirender di balik tampilan lain pada halaman. Tampilan ini bersifat opsional.
  5. Tampilan latar depan halaman, dalam hal ini logo. Tampilan ini selalu dirender di depan semua tampilan lain pada halaman. Tampilan ini bersifat opsional.

Lakukan inisialisasi informasi halaman saat OnboardingSupportFragment pertama kali dibuat atau dilampirkan pada aktivitas induk, karena sistem meminta informasi halaman saat membuat tampilan fragmen. Anda dapat melakukan inisialisasi informasi halaman di konstruktor class atau dalam penggantian onAttach().

Ganti setiap metode berikut yang memberikan informasi halaman ke sistem:

Ganti setiap metode berikut untuk menyediakan subtampilan opsional yang digunakan untuk menampilkan gambar atau animasi:

  • onCreateBackgroundView() menampilkan View yang Anda buat untuk bertindak sebagai tampilan latar, atau null jika tampilan latar tidak diperlukan.
  • onCreateContentView() menampilkan View yang Anda buat untuk bertindak sebagai tampilan konten, atau null jika tampilan konten tidak diperlukan.
  • onCreateForegroundView() menampilkan View yang Anda buat untuk bertindak sebagai tampilan latar depan, atau null jika tampilan latar depan tidak diperlukan.

Sistem menambahkan View yang Anda buat ke tata letak halaman. Contoh berikut mengganti onCreateContentView() dan menampilkan ImageView:

Kotlin

    private lateinit var contentView: ImageView
    ...
    override fun onCreateContentView(inflater: LayoutInflater?, container: ViewGroup?): View? {
        return ImageView(context).apply {
            scaleType = ImageView.ScaleType.CENTER_INSIDE
            setImageResource(R.drawable.onboarding_content_view)
            setPadding(0, 32, 0, 32)
            contentView = this
        }
    }
    

Java

    private ImageView contentView;
    ...
    @Override
    protected View onCreateContentView(LayoutInflater inflater, ViewGroup container) {
        contentView = new ImageView(getContext());
        contentView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
        contentView.setImageResource(R.drawable.onboarding_content_view);
        contentView.setPadding(0, 32, 0, 32);
        return contentView;
    }
    

Menambahkan layar logo awal

OnboardingSupportFragment Anda dapat dimulai dengan layar logo opsional yang memperkenalkan aplikasi Anda. Jika Anda ingin menampilkan file Drawable sebagai layar logo, di OnboardingSupportFragment's metode onCreate(), panggil setLogoResourceId() dengan ID Drawable Anda. Sistem akan memudar dan menampilkan Drawable ini secara singkat, lalu memudarkan Drawable sebelum menampilkan halaman pertama OnboardingSupportFragment Anda.

Jika Anda ingin memberikan animasi kustom untuk layar logo, bukan memanggil setLogoResourceId(), namun ganti onCreateLogoAnimation() dan tampilkan objek Animator yang merender animasi kustom Anda, seperti yang ditunjukkan pada contoh berikut:

Kotlin

    public override fun onCreateLogoAnimation(): Animator =
            AnimatorInflater.loadAnimator(context, R.animator.onboarding_logo_screen_animation)
    

Java

    @Override
    public Animator onCreateLogoAnimation() {
        return AnimatorInflater.loadAnimator(getContext(),
                R.animator.onboarding_logo_screen_animation);
    }
    

Menyesuaikan animasi halaman

Sistem menggunakan animasi default saat menampilkan halaman pertama OnboardingSupportFragment dan saat pengguna menavigasi ke halaman yang berbeda. Anda dapat menyesuaikan animasi ini dengan mengganti metode di OnboardingSupportFragment Anda.

Untuk menyesuaikan animasi yang muncul di halaman pertama Anda, ganti onCreateEnterAnimation() dan tampilkan Animator. Contoh berikut membuat Animator yang menskalakan tampilan konten secara horizontal:

Kotlin

    override fun onCreateEnterAnimation(): Animator =
        ObjectAnimator.ofFloat(contentView, View.SCALE_X, 0.2f, 1.0f)
                .setDuration(ANIMATION_DURATION)
    

Java

    @Override
    protected Animator onCreateEnterAnimation() {
        Animator startAnimator = ObjectAnimator.ofFloat(contentView,
                View.SCALE_X, 0.2f, 1.0f).setDuration(ANIMATION_DURATION);
        return startAnimator;
    }
    

Untuk menyesuaikan animasi yang digunakan saat pengguna membuka halaman lain, ganti onPageChanged(). Dalam metode onPageChanged(), buat Animators yang menghapus halaman sebelumnya dan menampilkan halaman berikutnya, tambahkan ke AnimatorSet, dan putar set. Contoh berikut menggunakan animasi fade-out untuk menghilangkan halaman sebelumnya, mengupdate gambar tampilan konten, dan menggunakan animasi fade-in untuk menampilkan halaman berikutnya:

Kotlin

    override fun onPageChanged(newPage: Int, previousPage: Int) {
        // Create a fade-out animation used to fade out previousPage and, once
        // done, swaps the contentView image with the next page's image.
        val fadeOut = ObjectAnimator.ofFloat(mContentView, View.ALPHA, 1.0f, 0.0f)
                .setDuration(ANIMATION_DURATION)
                .apply {
                    addListener(object : AnimatorListenerAdapter() {

                        override fun onAnimationEnd(animation: Animator) {
                            mContentView.setImageResource(pageImages[newPage])
                        }
                    })
                }
        // Create a fade-in animation used to fade in nextPage
        val fadeIn = ObjectAnimator.ofFloat(mContentView, View.ALPHA, 0.0f, 1.0f)
                .setDuration(ANIMATION_DURATION)
        // Create AnimatorSet with our fade-out and fade-in animators, and start it
        AnimatorSet().apply {
            playSequentially(fadeOut, fadeIn)
            start()
        }
    }
    

Java

    @Override
    protected void onPageChanged(final int newPage, int previousPage) {
        // Create a fade-out animation used to fade out previousPage and, once
        // done, swaps the contentView image with the next page's image.
        Animator fadeOut = ObjectAnimator.ofFloat(mContentView,
                View.ALPHA, 1.0f, 0.0f).setDuration(ANIMATION_DURATION);
        fadeOut.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                mContentView.setImageResource(pageImages[newPage]);
            }
        });
        // Create a fade-in animation used to fade in nextPage
        Animator fadeIn = ObjectAnimator.ofFloat(mContentView,
                View.ALPHA, 0.0f, 1.0f).setDuration(ANIMATION_DURATION);
        // Create AnimatorSet with our fade-out and fade-in animators, and start it
        AnimatorSet set = new AnimatorSet();
        set.playSequentially(fadeOut, fadeIn);
        set.start();
    }
    

Untuk detail selengkapnya tentang cara membuat Animators dan AnimatorSets, lihat Animasi properti.

Menyesuaikan tema

Setiap implementasi OnboardingSupportFragment harus menggunakan tema Theme_Leanback_Onboarding atau tema yang diturunkan dari Theme_Leanback_Onboarding. Tetapkan tema untuk OnboardingSupportFragment Anda dengan melakukan salah satu langkah berikut:

  • Tetapkan aktivitas induk OnboardingSupportFragment's untuk menggunakan tema yang diinginkan. Contoh berikut menunjukkan cara menetapkan aktivitas untuk menggunakan Theme_Leanback_Onboarding dalam manifes aplikasi:
        <activity
           android:name=".OnboardingActivity"
           android:enabled="true"
           android:exported="true"
           android:theme="@style/Theme.Leanback.Onboarding">
        </activity>
        
  • Tetapkan tema dalam aktivitas induk menggunakan atribut LeanbackOnboardingTheme_onboardingTheme dalam tema aktivitas kustom. Arahkan atribut ini ke tema kustom lain yang hanya terdapat objek OnboardingSupportFragment dalam aktivitas penggunaan Anda. Gunakan pendekatan ini jika aktivitas Anda sudah menggunakan tema kustom dan Anda tidak ingin menerapkan OnboardingSupportFragment gaya ke tampilan lain dalam aktivitas tersebut.
  • Ganti onProvideTheme() dan tampilkan tema yang diinginkan. Gunakan pendekatan ini jika beberapa aktivitas menggunakan OnboardingSupportFragment Anda atau aktivitas induk tidak dapat menggunakan tema yang diinginkan. Contoh berikut mengganti onProvideTheme() dan menampilkan Theme_Leanback_Onboarding:

    Kotlin

        override fun onProvideTheme(): Int = R.style.Theme_Leanback_Onboarding
        

    Java

        @Override
        public int onProvideTheme() {
           return R.style.Theme_Leanback_Onboarding;
        }