هنگامی که اینترنت قطع باشه و بخواهیم به کاربر خطایی نمایش بدیم، یا صفحه ای که قرار هست باز بشه به هر دلیلی با مشکلی مواجه بشه، در حالت عادی در اپلیکیشن موبایل اندروید یک صفحه یا فرگمنت نمایش خطا ایجاد می کنیم و این صفحه در مواقع ضروری باز میشه. جالب اینجاست که LeanBack حتی برای این بخش هم کار ما رو راحت کرده، توسط ErrorFragment

مثل قبل اول یک اکتیویتی به نام ErrorActivity ایجاد می کنم:

class ErrorActivity : FragmentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_error)
        val mErrorFragment = ErrorViewFragment()
        supportFragmentManager.beginTransaction().add(R.id.fragment_error_root, mErrorFragment)
            .commit()
    }
}

 با layout زیر (R.layout. activity_error):

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/fragment_error_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

همینطور من یک ErrorViewFragment ایجاد کردم که قرار هست داخلش پیغام خطای مورد نظرم نمایش داده بشه.

تنها متدی که در این فرگمنت باید بازنویسی بشه onCreate هست که داخل آن می توانم پیغام خطا، آیکون و سایر موارد رو مقدار دهی کنم:

class ErrorViewFragment : ErrorSupportFragment() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        title = "Oooops :("
        imageDrawable = ContextCompat.getDrawable(requireContext(), R.drawable.lb_ic_sad_cloud)
        message = "NO Internet connection!"
        setDefaultBackground(false)
        buttonText = "Back to home"
        buttonClickListener = View.OnClickListener {
            activity?.finish()
        }
    }
}

با تغییر کد زیر در MainFragment، در صورتی که آیتم کلیک شده از نوع Movie نباشد، صفحه خطا را باز می کنم:

onItemViewClickedListener = OnItemViewClickedListener { _, item, _, _ ->
    if (item is Movie){
        startActivity(Intent(activity, MovieDetailsActivity::class.java).putExtra(MovieDetailsFragment.EXTRA_MOVIE
            , item))
    }else{
        startActivity(Intent(activity, ErrorActivity::class.java))
    }
}

و خروجی:

که با زدن دکمه BackToHome، به صفحه اصلی برمیگردم.

طبق قول کدها قرار هست داخل گیت قرار بگیرند. پس من داخل ریپوزیتوری گیتهابی که به این پروژه تخصیص دادم، روی برنچ iodroid_tv/add_error_fragmentکد این بخش از آموزش رو قرار دادم. (طبیعتا کد نهایی هم روی برنج master موجود هست)
برای دسترسی به این شاخه از پروژه گیتهاب کلیک کنید 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *
You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>