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

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

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

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

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

OnBackPressedDispatcher نحوه ارسال رویدادهای دکمه Back به یک یا چند شی OnBackPressedCallback را کنترل می کند. سازنده برای OnBackPressedCallback یک بولی برای حالت فعال اولیه می گیرد. تنها زمانی که یک callback فعال باشد (یعنی isEnabled() true را برمی گرداند) ارسال کننده با handleOnBackPressed() callback تماس می گیرد تا رویداد دکمه برگشت را مدیریت کند. با فراخوانی setEnabled() می توانید وضعیت فعال را تغییر دهید.

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

در اینجا نمونه ای از اجرای فراخوان آورده شده است:

کاتلین

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() چندین تماس پاسخ دهید. هنگام انجام این کار، تماس‌های برگشتی به ترتیب معکوسی که اضافه می‌شوند فراخوانی می‌شوند - پاسخ تماسی که آخرین بار اضافه شده است، اولین فرصتی است که به رویداد دکمه برگشت داده می‌شود. به عنوان مثال، اگر سه تماس با نام های one ، two و three را به ترتیب اضافه کنید، آنها به ترتیب به ترتیب three ، two و one فراخوانی می شوند.

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

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

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

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

فعالیت onBackPressed()

اگر از onBackPressed() برای مدیریت رویدادهای دکمه Back استفاده می کنید، توصیه می کنیم به جای آن از OnBackPressedCallback استفاده کنید. با این حال، اگر نمی توانید این تغییر را انجام دهید، قوانین زیر اعمال می شود:

  • همه تماس‌های ثبت‌شده از طریق addCallback با فراخوانی super.onBackPressed() ارزیابی می‌شوند.
  • در Android 12 (سطح API 32) و پایین‌تر، بدون در نظر گرفتن موارد ثبت‌شده OnBackPressedCallback ، همیشه onBackPressed فراخوانی می‌شود.