التنقل الخلفي هو كيفية رجوع المستخدمين عبر سجلّ الشاشات التي يستخدمونها تمت زيارتها من قبل. توفر جميع أجهزة Android زر الرجوع لهذا النوع من والتنقل، لذلك يجب عدم إضافة زر الرجوع إلى واجهة مستخدم التطبيق. استنادًا إلى جهاز Android الخاص بالمستخدم، فقد يكون هذا الزرّ زرًا فعليًا أو برنامجًا .
يحتفظ Android بحزمة خلفية من الوجهات أثناء تنقل المستخدم.
في جميع أنحاء التطبيق. يتيح ذلك عادةً لنظام التشغيل Android الانتقال بشكل صحيح إلى
الوجهات السابقة عند الضغط على الزر "رجوع". ومع ذلك، هناك بعض
الحالات التي قد يحتاج فيها تطبيقك إلى تنفيذ سلوك "رجوع"
تقدم أفضل تجربة مستخدم ممكنة. على سبيل المثال، عند استخدام WebView
،
قد ترغب في إلغاء سلوك زر الرجوع الافتراضي للسماح للمستخدم
التنقل عبر سجل تصفح الويب بدلاً من الشاشات السابقة
في تطبيقك.
تنفيذ شريط رجوع مخصّص
ComponentActivity
، القاعدة
الصف الدراسي لـ FragmentActivity
وAppCompatActivity
،
التحكم في سلوك زر الرجوع باستخدام
OnBackPressedDispatcher
،
والذي يمكنك استرداده من خلال استدعاء getOnBackPressedDispatcher()
.
يتحكّم OnBackPressedDispatcher
في طريقة نقل أحداث زر الرجوع.
إلى OnBackPressedCallback
واحد أو أكثر
الأخرى. تأخذ الدالة الإنشائية لـ OnBackPressedCallback
قيمة منطقية
حالة التمكين الأولية. فقط عند تفعيل ميزة معاودة الاتصال (أي
isEnabled()
إرجاع true
) هل يقوم المرسل باستدعاء رقم
handleOnBackPressed()
لمعالجة حدث زر الرجوع. يمكنك تغيير حالة التفعيل من خلال الاتصال
setEnabled()
تتم إضافة طلبات معاودة الاتصال من خلال طرق addCallback
. ننصح بشدة
استخدام addCallback()
والتي تستغرق LifecycleOwner
.
ويضمن ذلك عدم إضافة OnBackPressedCallback
إلا عند ضبط LifecycleOwner
.
Lifecycle.State.STARTED
ويزيل النشاط أيضًا معاودة الاتصال المسجَّلة عندما تكون مرتبطة بها
تم إتلاف LifecycleOwner
، ما يمنع تسرُّب الذاكرة ويجعله مناسبًا.
للاستخدام في الأجزاء أو لمالكي غيرها من مراحل النشاط التي لا تدوم طويلاً
من النشاط.
في ما يلي مثال على تنفيذ معاودة الاتصال:
Kotlin
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 } ... }
Java
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
على التوالي.
تتبع عمليات معاودة الاتصال
سلسلة المسؤولية
النمط. لا يتم استدعاء كل استدعاء في السلسلة إلا إذا كانت السمة السابقة
لم يتم تفعيل رد الاتصال. وهذا يعني أنه في
المثال السابق، لن يتم استدعاء معاودة الاتصال two
إلا إذا كان معاودة الاتصال three
لم يتم تفعيل. لن يتم استدعاء معاودة الاتصال one
إلا في حال معاودة الاتصال two
لم يتم تفعيلها، وهكذا.
يُرجى العِلم بأنّه عند الإضافة عبر addCallback()
،
أنه لا تتم إضافة معاودة الاتصال إلى سلسلة المسؤولية حتى
إدخال LifecycleOwner
في
Lifecycle.State.STARTED
الولاية.
تغيير حالة التفعيل على OnBackPressedCallback
كبير جدًا
موصى به لإجراء تغييرات مؤقتة لأنه يحافظ على الطلب الموضح أعلاه،
وهو أمر مهم بشكل خاص إذا كانت لديك عمليات معاودة الاتصال مسجَّلة على
مالكي مراحل نشاط متداخلين مختلفين.
أمّا في الحالات التي تريد فيها إزالة OnBackPressedCallback
نهائيًا،
عليك الاتصال
remove()
ليس ذلك ضروريًا عادةً، لأنّ عمليات معاودة الاتصال تتم إزالتها تلقائيًا عند ربط LifecycleOwner
المرتبطة بها.
دُمّر
النشاط onBackPressed()
في حال استخدام
onBackPressed()
للتعامل مع أحداث زر الرجوع، فإننا نوصي باستخدام
OnBackPressedCallback
بدلاً من ذلك.
ومع ذلك، إذا لم تتمكّن من إجراء هذا التغيير، سيتم تطبيق القواعد التالية:
- يتم تقييم جميع عمليات معاودة الاتصال المسجَّلة عبر
addCallback
عند الاتصالsuper.onBackPressed()
- في Android 12 (المستوى 32 لواجهة برمجة التطبيقات) والإصدارات الأقدم، يُطلق دائمًا على
onBackPressed
، بغض النظر عن أي مثيلات مسجَّلة لـOnBackPressedCallback
.