توفير تنقل مخصّص إلى الخلف

التنقل الخلفي هو كيفية رجوع المستخدمين عبر سجلّ الشاشات التي يستخدمونها تمت زيارتها من قبل. توفر جميع أجهزة 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.