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

يتنقّل المستخدمون للخلف بين الشاشات باستخدام إيماءة الرجوع. تحتوي معظم أجهزة Android على زر رجوع، سواء كان زرًا ماديًا أو زرًا في البرنامج أو زرًا يستند إلى الإيماءات. عادةً، لا يُنصح بإضافة زر رجوع إلى تطبيقك، ولكن أجهزة نظام التشغيل Android Automotive ‏ (AAOS) في وضع التوافق تستخدم زر رجوع خاصًا بالنظام. يتولّى هذا الإجراء عملية التنقّل، لذلك لن تحتاج إلى إضافة عملية التنقّل الخاصة بك. لمعرفة التفاصيل، يُرجى الاطّلاع على وضع التوافق في نظام التشغيل Android Automotive.

يحتفظ نظام التشغيل Android بذاكرة مؤقتة للرجوع تتضمّن الوجهات التي يتنقّل المستخدم بينها في تطبيقك. يتيح ذلك عادةً لنظام التشغيل Android الانتقال بشكل صحيح إلى الوجهات السابقة عند الضغط على الزر "رجوع". ومع ذلك، هناك بعض الحالات التي قد يحتاج فيها تطبيقك إلى تنفيذ سلوك "الرجوع" الخاص به من أجل تقديم أفضل تجربة ممكنة للمستخدم. على سبيل المثال، عند استخدام WebView، قد تحتاج إلى إلغاء السلوك التلقائي لزر الرجوع للسماح للمستخدم بالتنقل إلى الخلف خلال سجلّ تصفّحه للويب بدلاً من الشاشات السابقة في تطبيقك.

تنفيذ ميزة "الرجوع" المخصّصة في Compose

في Jetpack Compose، يمكنك التعامل مع التنقّل المخصّص للخلف باستخدام العنصر القابل للإنشاء BackHandler.

عند استخدام Navigation Compose، يمكنك عادةً استخدام NavController.navigateUp() أو NavController.popBackStack() للانتقال إلى الشاشة السابقة في سجلّ الرجوع. ومع ذلك، يكون BackHandler مفيدًا في الحالات التي تريد فيها تنفيذ سلوك مخصّص عندما يضغط المستخدم على زر الرجوع في النظام أو يستخدم إيماءة الرجوع. على سبيل المثال، إذا كنت تعرض WebView في تطبيقك، قد تريد السماح للمستخدمين بالرجوع إلى سجلّ التصفّح عند الضغط على زر الرجوع في النظام.

إذا كان لديك عدة عناصر BackHandler قابلة للإنشاء مفعَّلة في مستويات مختلفة من شجرة العناصر القابلة للإنشاء، سيعترض العنصر الأعمق فقط على حدث الرجوع.

تنفيذ التنقّل المخصّص للخلف باستخدام طرق العرض

تتيح لك الفئة الأساسية ComponentActivity، الخاصة بالفئتَين FragmentActivity وAppCompatActivity، التحكّم في سلوك زر الرجوع باستخدام السمة OnBackPressedDispatcher التي يمكنك استردادها من خلال استدعاء getOnBackPressedDispatcher().

يتحكّم OnBackPressedDispatcher في كيفية إرسال أحداث زر الرجوع إلى كائن واحد أو أكثر من كائنات OnBackPressedCallback. تأخذ الدالة الإنشائية الخاصة بفئة OnBackPressedCallback قيمة منطقية للحالة المفعَّلة الأولية. لن يستدعي أداة المعالجة الدالة handleOnBackPressed() الخاصة بالدالة التنفيذية إلا عند تفعيل دالة تنفيذية، مثلاً عندما تعرض الدالة isEnabled() القيمة true، وذلك لمعالجة حدث زر الرجوع. يمكنك تغيير الحالة المفعّلة من خلال استدعاء 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 المرتبط بها.