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