مؤلفه «پیمایش» با سیستمعامل Android کار میکند تا پشته قبلیها را هنگام پیمایش کاربر در برنامه شما حفظ کند. در برخی موارد، ممکن است حفظ همزمان چندین پشته قبلیها مفید باشد، بهطوریکه کاربر بتواند بین آنها جابهجا شود. برای مثال، اگر برنامهتان شامل پیمایش پایین یا کشوی پیمایش باشد، پشتیبانی از پشته قبلیها چندگانه به کاربران اجازه میدهد آزادانه بین جریانها در برنامهتان جابهجا شوند بدون اینکه جایشان را در هیچکدام از آنها ازدست بدهند.
مؤلفه Navigation میاناهای برنامهسازی کاربردیای ارائه میدهد که با ذخیره و بازیابی وضعیت مقصدها در نمودار پیمایش شما، از چندین پشته قبلیها پشتیبانی میکنند. کلاس
NavigationUI شامل
روشهایی است که این کار را بهطور خودکار انجام میدهند، اما میتوانید از میاناهای برنامهسازی کاربردی زیربنایی
بهصورت دستی نیز استفاده کنید تا پیادهسازی سفارشیتری داشته باشید.
پیادهسازی خودکار پشتیبانی با NavigationUI
کلاس NavigationUI
شامل میاناهای برنامهسازی کاربردی است که بهطور خودکار وضعیت گزینههای منو را هنگام جابهجایی کاربر بین آنها ذخیره و بازیابی میکند. این میاناهای برنامهسازی کاربردی بهطور پیشفرض در موارد زیر پشتیبانی از چند پشته قبلیها را پیادهسازی میکنند:
- وقتی از سربارگذاری مناسب
setupWithNavController()برای مرتبط کردن نمونهای ازNavigationViewیاBottomNavigationViewبا نمونهNavControllerاستفاده میکنید، همانطور که در افزودن کشوی پیمایش یا پیمایش پایین شرح داده شده است. - وقتی از
onNavDestinationSelected()برای ایجاد رابط کاربری منو پیمایش سفارشی مرتبط با مقصدهای میزبانیشده توسط نمونهNavControllerاستفاده میکنید.
این میاناهای برنامهسازی کاربردی برای پیادهسازی پشتیبانی از پشته قبلیهای چندگانه به تغییرات کد بیشتری نیاز ندارند و روش توصیهشده برای پشتیبانی از پشته قبلیهای چندگانه در برنامهتان هستند.
پیادهسازی پشتیبانی بهصورت دستی با میاناهای برنامهسازی کاربردی زیربنایی
اگر عناصر ارائهشده توسط NavigationUI الزامات شما را برآورده نمیکنند، میتوانید از میاناهای برنامهسازی کاربردی زیربنایی برای ذخیره و بازیابی پشتههای قبلیها ازطریق یکی از سطوح دیگر میانای برنامهسازی کاربردی ارائهشده توسط مؤلفه «پیمایش» استفاده کنید.
XML پیمایش
در Navigation XML، عناصر <action> در نمودار پیمایش شما میتوانند از
مشخصه app:popUpToSaveState برای ذخیره کردن وضعیت هر مقصدی که
کنش بااستفاده از app:popUpTo باز کرده است استفاده کنند. همچنین میتوانند از مشخصه app:restoreState برای بازیابی هرگونه وضعیت ذخیرهشده قبلی برای مقصد تعریفشده در مشخصه app:destination استفاده کنند.
میتوانید از این مشخصهها برای پشتیبانی از چندین پشته قبلیها استفاده کنید. وقتی کنش پیمایش باید کاربر را از یک پشته قبلیها به پشته قبلیهای دیگری منتقل کند، هر دو app:popUpToSaveState و app:restoreState را در عنصر <action> مربوطه روی true تنظیم کنید. به این ترتیب، کنش وضعیت پشته قبلیها فعلی را ذخیره میکند و درعینحال وضعیت قبلاً ذخیرهشده پشته قبلیها مقصد را (درصورت وجود) بازیابی میکند.
مثال زیر کنشی را نشان میدهد که از هر دو این مشخصهها استفاده میکند:
<action
android:id=”@+id/swap_stack”
app:destination=”@id/second_stack”
app:restoreState=”true”
app:popUpTo=”@id/first_stack_start_destination”
app:popUpToSaveState=”true” />
NavOptions
کلاس NavOptions
به شما امکان میدهد گزینههای پیمایش ویژهای را برای ذخیره و بازیابی پشتههای قبلیها
هنگام پیمایش بااستفاده از NavController ارسال کنید. این موضوع چه نمونه NavOptions را بااستفاده از Kotlin DSL ایجاد کنید و چه بااستفاده از NavOptions.Builder، صادق است:
کاتلین
// Use the navigate() method that takes a navOptions DSL Builder navController.navigate(selectedBottomNavRoute) { launchSingleTop = true restoreState = true popUpTo(navController.graph.findStartDestination().id) { saveState = true } }
جاوا
NavOptions navOptions = new NavOptions.Builder() .setLaunchSingleTop(true) .setRestoreState(true) .setPopUpTo(NavGraph.findStartDestination(navController.getGraph()).getId(), false, // inclusive true) // saveState .build(); navController.navigate(selectedBottomNavId, null, navOptions);
برای کسب اطلاعات بیشتر درباره ارسال گزینههای پیمایش، به اعمال NavOptions بهصورت برنامهنویسی مراجعه کنید.
منابع بیشتر
برای کسب اطلاعات بیشتر درباره پشتیبانی از پشته قبلیها چندگانه با مؤلفه «پیمایش»، منابع اضافی زیر را ببینید:
پستهای وبلاگ
- MAD Skills: Navigation multiple back stacks در Medium
- پیمایش: بررسی دقیق پشتههای قبلیها در Medium
نمونهها
- برنامه Now in Android در GitHub
- Jetnews در GitHub
- Jetsnack در GitHub