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

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

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

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

Android 13 و بالاتر شامل یک حرکت پیش‌بینی کننده برگشت برای دستگاه‌های Android است. برای کسب اطلاعات بیشتر در مورد این ویژگی، به «افزودن پشتیبانی برای حرکت پیشگویانه برگشت» مراجعه کنید.

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

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

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

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

در اینجا یک نمونه اجرای callback آورده شده است:

کاتلین

class MyFragment : Fragment() {

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

        // This callback is only 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 is only 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 فقط در صورتی فراخوانی می شود که callback two فعال نباشد.

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

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

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

فعالیت onBackPressed()

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

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