ناوبری برگشت سفارشی را ارائه دهید

کاربران با استفاده از ناوبری برگشتی ، در صفحات به عقب حرکت می‌کنند. اکثر دستگاه‌های اندروید دارای یک دکمه برگشت هستند - فیزیکی، نرم‌افزاری یا مبتنی بر حرکت. معمولاً نباید دکمه برگشتی را به برنامه خود اضافه کنید. با این حال، دستگاه‌های دارای سیستم عامل اندروید اتوموتیو (AAOS) در حالت سازگاری از یک دکمه برگشت سیستمی استفاده می‌کنند. این دکمه، ناوبری را مدیریت می‌کند، بنابراین نیازی به اضافه کردن دکمه خودتان ندارید. برای جزئیات بیشتر، به حالت سازگاری AAOS مراجعه کنید.

اندروید هنگام پیمایش کاربر در سراسر برنامه، مجموعه‌ای از مقاصد را در پشته خود نگه می‌دارد. این معمولاً به اندروید اجازه می‌دهد تا هنگام فشردن دکمه برگشت، به درستی به مقاصد قبلی پیمایش کند. با این حال، مواردی وجود دارد که ممکن است برنامه شما نیاز به پیاده‌سازی رفتار برگشت خود داشته باشد تا بهترین تجربه کاربری ممکن را ارائه دهد. به عنوان مثال، هنگام استفاده از WebView ، ممکن است بخواهید رفتار پیش‌فرض دکمه برگشت را لغو کنید تا به کاربر اجازه دهید به جای صفحات قبلی در برنامه شما، در تاریخچه مرور وب خود به عقب برگردد.

پیاده‌سازی ناوبری برگشت سفارشی در Compose

در Jetpack Compose، می‌توانید با استفاده از BackHandler composable، ناوبری برگشتی سفارشی را مدیریت کنید.

هنگام استفاده از Navigation Compose ، معمولاً از NavController.navigateUp() یا NavController.popBackStack() برای حرکت به صفحه قبلی در back stack استفاده می‌کنید. با این حال، BackHandler برای مواردی مفید است که می‌خواهید هنگام فشار دادن دکمه برگشت سیستم یا استفاده از حرکت برگشت، رفتار سفارشی را پیاده‌سازی کنید. به عنوان مثال، اگر در برنامه خود یک WebView نمایش می‌دهید، ممکن است بخواهید به کاربران اجازه دهید هنگام فشار دادن دکمه برگشت سیستم، در تاریخچه مرور به عقب برگردند.

اگر چندین کامپوننت BackHandler فعال در سطوح مختلف درخت کامپوننت خود داشته باشید، فقط درونی‌ترین آنها رویداد back را رهگیری می‌کند.

پیاده‌سازی ناوبری سفارشی به عقب با Views

ComponentActivity ، کلاس پایه برای FragmentActivity و AppCompatActivity ، به شما امکان می‌دهد رفتار دکمه برگشت را با استفاده از OnBackPressedDispatcher آن کنترل کنید، که می‌توانید با فراخوانی getOnBackPressedDispatcher() آن را بازیابی کنید.

OnBackPressedDispatcher نحوه‌ی ارسال رویدادهای دکمه‌ی برگشت به یک یا چند شیء OnBackPressedCallback را کنترل می‌کند. سازنده‌ی OnBackPressedCallback برای حالت اولیه‌ی فعال، یک مقدار بولی می‌گیرد. تنها زمانی که یک فراخوانی فعال شود، برای مثال وقتی isEnabled() true را برمی‌گرداند، dispatcher تابع handleOnBackPressed() مربوط به فراخوانی را برای مدیریت رویداد دکمه‌ی برگشت فراخوانی می‌کند. می‌توانید حالت فعال را با فراخوانی setEnabled() تغییر دهید.

فراخوانی‌های برگشتی با استفاده از متدهای addCallback اضافه می‌شوند. از متد addCallback() که یک LifecycleOwner می‌گیرد استفاده کنید. به این ترتیب OnBackPressedCallback فقط زمانی اضافه می‌شود که LifecycleOwner Lifecycle.State.STARTED باشد. این activity همچنین فراخوانی‌های برگشتی ثبت‌شده را هنگامی که LifecycleOwner مرتبط با آنها از بین می‌رود، حذف می‌کند، که از نشت حافظه جلوگیری می‌کند و آن را برای استفاده در fragmentها یا سایر مالکان چرخه عمر که طول عمر کوتاه‌تری نسبت به activity دارند، مناسب می‌سازد.

در اینجا یک مثال از پیاده‌سازی فراخوانی برگشتی آورده شده است:

کاتلین

class MyFragment : Fragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // This callback will only be called when MyFragment is at least Started.
        val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
            // Handle the back button event
        }

        // The callback can be enabled or disabled here or in the lambda
    }
    ...
}

جاوا

public class MyFragment extends Fragment {

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // This callback will only be called when MyFragment is at least Started.
        OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) {
            @Override
            public void handleOnBackPressed() {
                // Handle the back button event
            }
        };
        requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);

        // The callback can be enabled or disabled here or in handleOnBackPressed()
    }
    ...
}

شما می‌توانید با استفاده از addCallback() چندین تابع فراخوانی (callback) ایجاد کنید. هنگام انجام این کار، تابع‌های فراخوانی به ترتیب معکوسی که اضافه شده‌اند فراخوانی می‌شوند - تابع فراخوانی که آخرین بار اضافه شده است، اولین تابعی است که فرصت مدیریت رویداد دکمه برگشت (Back) را دارد. برای مثال، اگر سه تابع فراخوانی به نام‌های one ، two و three را به ترتیب اضافه کنید، به ترتیب three ، two و one فراخوانی می‌شوند.

فراخوانی‌های برگشتی از الگوی زنجیره مسئولیت پیروی می‌کنند. هر فراخوانی برگشتی در این زنجیره فقط در صورتی فراخوانی می‌شود که فراخوانی برگشتی قبلی فعال نباشد. این بدان معناست که در مثال قبلی، فراخوانی برگشتی two فقط در صورتی فراخوانی می‌شود که فراخوانی برگشتی three فعال نباشد. فراخوانی برگشتی one فقط در صورتی فراخوانی می‌شود که فراخوانی برگشتی two فعال نباشد و به همین ترتیب ادامه می‌یابد.

توجه داشته باشید که هنگام اضافه شدن با استفاده از addCallback() ، فراخوانی برگشتی تا زمانی که LifecycleOwner وارد حالت Lifecycle.State.STARTED نشود، به زنجیره مسئولیت اضافه نمی‌شود.

تغییر وضعیت فعال‌شده در OnBackPressedCallback برای تغییرات موقت اکیداً توصیه می‌شود، زیرا ترتیب ذکر شده در بالا را حفظ می‌کند، که به‌ویژه در صورتی که callbackهایی را در چندین مالک چرخه عمر تودرتوی مختلف ثبت کرده‌اید، اهمیت دارد.

با این حال، در مواردی که می‌خواهید OnBackPressedCallback به طور کامل حذف کنید، باید تابع remove() را فراخوانی کنید. با این حال، این کار معمولاً ضروری نیست، زیرا callbackها به طور خودکار هنگام از بین رفتن LifecycleOwner مرتبط با آنها حذف می‌شوند.