کاربرانی که برای اولین بار هستند را به برنامه خود معرفی کنید

با Compose بهتر بسازید
با استفاده از Jetpack Compose برای سیستم عامل Android TV، رابط‌های کاربری زیبایی با حداقل کد ایجاد کنید.

برای اینکه به کاربر جدید نشان دهید که چگونه می‌تواند بیشترین بهره را از اپلیکیشن شما ببرد، اطلاعات اولیه را در هنگام راه‌اندازی اپلیکیشن ارائه دهید. در اینجا چند نمونه از اطلاعات اولیه آورده شده است:

  • اطلاعات دقیقی در مورد کانال‌های موجود هنگام دسترسی اولیه کاربر به یک برنامه کانال ارائه دهید.
  • به ویژگی‌های قابل توجه در اپلیکیشن خود توجه کنید.
  • هرگونه اقدام ضروری یا توصیه‌شده برای کاربران هنگام استفاده از برنامه برای اولین بار را شرح دهید.

کتابخانه androidx.leanback کلاس OnboardingSupportFragment را برای ارائه اطلاعات کاربر برای اولین بار ارائه می‌دهد. این راهنما نحوه استفاده از کلاس OnboardingSupportFragment را برای ارائه اطلاعات مقدماتی که هنگام اجرای اولیه برنامه نشان داده می‌شود، شرح می‌دهد.

OnboardingSupportFragment از بهترین شیوه‌های رابط کاربری تلویزیون برای ارائه اطلاعات به روشی استفاده می‌کند که با سبک‌های رابط کاربری تلویزیون مطابقت داشته باشد و پیمایش آن در دستگاه‌های تلویزیون آسان باشد.

شکل ۱. یک نمونه از OnboardingSupportFragment .

OnboardingSupportFragment برای هر موردی مناسب نیست. وقتی نیاز به اضافه کردن عناصر رابط کاربری دارید که به ورودی کاربر نیاز دارند، مانند دکمه‌ها و فیلدها، OnboardingSupportFragment استفاده نکنید. همچنین، از OnboardingSupportFragment برای کارهایی که کاربر مرتباً انجام می‌دهد استفاده نکنید. در نهایت، اگر نیاز به ارائه یک رابط کاربری چند صفحه‌ای دارید که به ورودی کاربر نیاز دارد، استفاده از GuidedStepSupportFragment را در نظر بگیرید.

یک قطعه پشتیبانی از ورود به سیستم اضافه کنید

برای افزودن OnboardingSupportFragment به برنامه خود، کلاسی را پیاده‌سازی کنید که کلاس OnboardingSupportFragment را ارث‌بری کند. این قطعه کد را به یک اکتیویتی اضافه کنید، یا با استفاده از XML طرح‌بندی اکتیویتی یا به صورت برنامه‌نویسی. مطمئن شوید که اکتیویتی یا قطعه کد از تمی مشتق شده از Theme_Leanback_Onboarding استفاده می‌کند، همانطور که در بخش سفارشی‌سازی تم‌ها توضیح داده شده است.

در متد onCreate() از activity اصلی برنامه‌تان، startActivity() را با یک Intent که به activity والد OnboardingSupportFragment شما اشاره می‌کند، فراخوانی کنید. این کار به شما کمک می‌کند تا OnboardingSupportFragment شما به محض شروع برنامه ظاهر شود.

برای اطمینان از اینکه OnboardingSupportFragment فقط در اولین باری که کاربر برنامه شما را اجرا می‌کند ظاهر می‌شود، از یک شیء SharedPreferences برای ردیابی اینکه آیا کاربر قبلاً OnboardingSupportFragment را مشاهده کرده است یا خیر، استفاده کنید. یک مقدار بولی تعریف کنید که وقتی کاربر مشاهده OnboardingSupportFragment را تمام کرد، به true تغییر کند. این مقدار را در متد onCreate() در فعالیت اصلی خود بررسی کنید و فقط در صورتی که مقدار false باشد، فعالیت والد OnboardingSupportFragment اجرا کنید.

مثال زیر یک override از onCreate() را نشان می‌دهد که مقدار SharedPreferences را بررسی می‌کند و اگر روی true تنظیم نشده باشد، startActivity() را برای نمایش OnboardingSupportFragment فراخوانی می‌کند:

کاتلین

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

جاوا

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

پس از اینکه کاربر OnboardingSupportFragment را مشاهده کرد، آن را با استفاده از شیء SharedPreferences به عنوان مشاهده شده علامت‌گذاری کنید. برای انجام این کار، onFinishFragment() را در OnboardingSupportFragment خود بازنویسی کنید و مقدار SharedPreferences خود را مطابق مثال زیر روی true تنظیم کنید:

کاتلین

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()
    }
}

جاوا

@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();
}

صفحات OnboardingSupportFragment را اضافه کنید

یک OnboardingSupportFragment محتوا را در مجموعه‌ای از صفحات مرتب نمایش می‌دهد. پس از افزودن OnboardingSupportFragment ، باید صفحات Onboarding را تعریف کنید. هر صفحه می‌تواند دارای عنوان، توضیحات و چندین زیرنمایش باشد که می‌توانند شامل تصاویر یا انیمیشن باشند.

شکل ۲. عناصر صفحه‌ی OnboardingSupportFragment .

شکل ۲ یک صفحه نمونه را نشان می‌دهد که در آن، المان‌های قابل تنظیم صفحه که OnboardingSupportFragment شما می‌تواند ارائه دهد، با استفاده از راهنماها مشخص شده‌اند. المان‌های صفحه عبارتند از:

  1. عنوان صفحه.
  2. توضیحات صفحه.
  3. نمای محتوای صفحه، در این مورد یک علامت تیک سبز ساده در یک کادر خاکستری. این نما اختیاری است. از این نما برای نمایش جزئیات صفحه استفاده کنید. برای مثال، می‌توانید یک اسکرین‌شات اضافه کنید که ویژگی برنامه‌ای که صفحه توصیف می‌کند را برجسته کند.
  4. نمای پس‌زمینه صفحه، در این مورد یک گرادیان آبی ساده. این نما همیشه پشت سایر نماهای صفحه رندر می‌شود. این نما اختیاری است.
  5. نمای پیش‌زمینه صفحه، در این مورد یک لوگو. این نما همیشه قبل از سایر نماهای صفحه رندر می‌شود. این نما اختیاری است.

اطلاعات صفحه را هنگام ایجاد یا اتصال OnboardingSupportFragment به اکتیویتی والد، مقداردهی اولیه کنید، زیرا سیستم هنگام ایجاد نمای فرگمنت، اطلاعات صفحه را درخواست می‌کند. می‌توانید اطلاعات صفحه را در سازنده کلاس خود یا در override تابع onAttach() مقداردهی اولیه کنید.

هر یک از متدهای زیر را که اطلاعات صفحه را به سیستم ارائه می‌دهند، بازنویسی کنید:

  • getPageCount() تعداد صفحات موجود در OnboardingSupportFragment شما را برمی‌گرداند.
  • getPageTitle() عنوان مربوط به شماره صفحه درخواستی را برمی‌گرداند.
  • getPageDescription() توضیحات مربوط به شماره صفحه درخواستی را برمی‌گرداند.

برای ارائه زیرنماهای اختیاری برای نمایش تصاویر یا انیمیشن‌ها، هر یک از روش‌های زیر را لغو کنید:

  • onCreateBackgroundView() یک View که شما ایجاد می‌کنید تا به عنوان background view عمل کند را برمی‌گرداند و در صورت عدم نیاز به background view، مقدار null را برمی‌گرداند.
  • onCreateContentView() یک View که شما ایجاد می‌کنید تا به عنوان content view عمل کند را برمی‌گرداند و در صورت عدم نیاز به content view، مقدار null را برمی‌گرداند.
  • onCreateForegroundView() یک View که شما ایجاد می‌کنید تا به عنوان نمای پیش‌زمینه عمل کند را برمی‌گرداند و در صورت عدم نیاز به نمای پیش‌زمینه، null را برمی‌گرداند.

سیستم، View ای را که شما ایجاد می‌کنید به طرح‌بندی صفحه اضافه می‌کند. مثال زیر متد onCreateContentView() را بازنویسی کرده و یک ImageView برمی‌گرداند:

کاتلین

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

جاوا

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

اضافه کردن صفحه لوگوی اولیه

OnboardingSupportFragment شما می‌تواند با یک صفحه لوگوی اختیاری که برنامه شما را معرفی می‌کند، شروع شود. اگر می‌خواهید یک Drawable به عنوان صفحه لوگوی خود نمایش دهید، تابع setLogoResourceId() را با شناسه Drawable خود در متد onCreate() از OnboardingSupportFragment خود فراخوانی کنید. سیستم Drawable به صورت محو نمایش می‌دهد و برای مدت کوتاهی نمایش می‌دهد، و سپس Drawable قبل از نمایش صفحه اول OnboardingSupportFragment شما، محو می‌کند.

اگر می‌خواهید یک انیمیشن سفارشی برای صفحه لوگوی خود ارائه دهید، به جای فراخوانی setLogoResourceId() ، متد onCreateLogoAnimation() را نادیده بگیرید و یک شیء Animator را که انیمیشن سفارشی شما را رندر می‌کند، برگردانید، همانطور که در مثال زیر نشان داده شده است:

کاتلین

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

جاوا

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

سفارشی‌سازی انیمیشن‌های صفحه

سیستم هنگام نمایش صفحه اول OnboardingSupportFragment و هنگامی که کاربر به صفحه دیگری می‌رود، از انیمیشن‌های پیش‌فرض استفاده می‌کند. می‌توانید این انیمیشن‌ها را با بازنویسی متدها در OnboardingSupportFragment خود سفارشی کنید.

برای سفارشی‌سازی انیمیشنی که در صفحه اول شما ظاهر می‌شود، متد onCreateEnterAnimation() را بازنویسی کنید و یک Animator را برگردانید. مثال زیر یک Animator ایجاد می‌کند که نمای محتوا را به صورت افقی مقیاس‌بندی می‌کند:

کاتلین

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

جاوا

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

برای سفارشی‌سازی انیمیشن مورد استفاده هنگام پیمایش کاربر به صفحه‌ای دیگر، تابع onPageChanged() را بازنویسی کنید. در متد onPageChanged() خود، اشیاء Animator ایجاد کنید که صفحه قبلی را حذف کرده و صفحه بعدی را نمایش می‌دهند، این اشیاء را به AnimatorSet اضافه کنید و مجموعه را پخش کنید. مثال زیر از یک انیمیشن محو شدن برای حذف صفحه قبلی، به‌روزرسانی تصویر نمای محتوا و از یک انیمیشن محو شدن برای نمایش صفحه بعدی استفاده می‌کند:

کاتلین

override fun onPageChanged(newPage: Int, previousPage: Int) {
    // Create a fade-out animation for previousPage and, once
    // done, swap 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 for nextPage
    val fadeIn = ObjectAnimator.ofFloat(mContentView, View.ALPHA, 0.0f, 1.0f)
            .setDuration(ANIMATION_DURATION)
    // Create AnimatorSet with fade-out and fade-in animators and start it
    AnimatorSet().apply {
        playSequentially(fadeOut, fadeIn)
        start()
    }
}

جاوا

@Override
protected void onPageChanged(final int newPage, int previousPage) {
    // Create a fade-out animation for previousPage and, once
    // done, swap 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 for nextPage
    Animator fadeIn = ObjectAnimator.ofFloat(mContentView,
            View.ALPHA, 0.0f, 1.0f).setDuration(ANIMATION_DURATION);
    // Create AnimatorSet with fade-out and fade-in animators and start it
    AnimatorSet set = new AnimatorSet();
    set.playSequentially(fadeOut, fadeIn);
    set.start();
}

برای جزئیات بیشتر در مورد نحوه ایجاد اشیاء Animator و اشیاء AnimatorSet ، به نمای کلی انیمیشن ویژگی مراجعه کنید.

سفارشی‌سازی تم‌ها

هرگونه پیاده‌سازی OnboardingSupportFragment باید یا از تم Theme_Leanback_Onboarding یا از تمی که از Theme_Leanback_Onboarding ارث‌بری می‌کند، استفاده کند. تم OnboardingSupportFragment خود را با انجام یکی از موارد زیر تنظیم کنید:

  • اکتیویتی والدِ OnboardingSupportFragment را طوری تنظیم کنید که از تم مورد نظر استفاده کند. مثال زیر نحوه تنظیم یک اکتیویتی برای استفاده از Theme_Leanback_Onboarding در مانیفست برنامه را نشان می‌دهد:
    <activity
       android:name=".OnboardingActivity"
       android:enabled="true"
       android:exported="true"
       android:theme="@style/Theme.Leanback.Onboarding">
    </activity>
  • با استفاده از ویژگی LeanbackOnboardingTheme_onboardingTheme در یک تم اکتیویتی سفارشی، تم را در اکتیویتی والد تنظیم کنید. این ویژگی را به یک تم سفارشی دیگر که فقط اشیاء OnboardingSupportFragment در اکتیویتی شما از آن استفاده می‌کنند، ارجاع دهید. اگر اکتیویتی شما از قبل از یک تم سفارشی استفاده می‌کند و نمی‌خواهید استایل‌های OnboardingSupportFragment را به سایر نماهای اکتیویتی اعمال کنید، از این رویکرد استفاده کنید.
  • تابع onProvideTheme() را بازنویسی کرده و تم مورد نظر را برمی‌گرداند. اگر چندین اکتیویتی OnboardingSupportFragment شما استفاده می‌کنند یا اگر اکتیویتی والد نمی‌تواند از تم مورد نظر استفاده کند، از این رویکرد استفاده کنید. مثال زیر تابع onProvideTheme() را بازنویسی کرده و Theme_Leanback_Onboarding را برمی‌گرداند:

    کاتلین

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

    جاوا

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