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

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