أفضل الممارسات المتعلّقة بالتفاعل مع خريطة التنقّل

توضّح هذه الصفحة أفضل الممارسات للتفاعل مع خريطة التنقّل في تطبيقك.

استخدِم NavigationFragment بدلاً من NavigationView متى أمكن ذلك

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

في حال استخدام NavigationView، يجب استخدام ترتيب صارم عند استدعاء طرق مراحل النشاط

يستضيف NavigationView خريطة التنقّل ويتابع عن كثب الأحداث التي تتم في مراحل النشاط، مثل أنشطة Android وأجزاء Android، ويتّخذ إجراءات محدّدة عند استدعاء هذه الأحداث. ينفّذ NavigationView عمليات إعداد متعددة على NavigationView#onCreate وNavigationView#onStart، وعمليات تنظيف على NavigationView#onStop وNavigationView#onDestroy، بالإضافة إلى معالجة الأحداث الأخرى التي تتم في مراحل النشاط.

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

لمزيد من المعلومات حول مراحل نشاط Android، يُرجى الاطّلاع على قسم مفاهيم مراحل النشاط في مستندات مطوّري برامج Android.

يوضّح الجدول التالي الحالات التي يجب فيها استدعاء طرق مراحل النشاط الأخرى، بعد طرق مراحل النشاط المحدّدة:

طريقة مراحل النشاط يتم استدعاؤها في أي مرحلة من مراحل النشاط يتم استدعاؤها بعد أي طريقة من طرق مراحل النشاط
onConfigurationChanged() يتم استدعاؤها عندما تكون واجهة المستخدم في المقدّمة وتتغيّر الإعدادات. بعد onStart() دائمًا
onTrimMemory() يتم استدعاؤها عندما يكون النشاط في الخلفية. بعد onPause() دائمًا
onSaveInstance() يتم استدعاؤها قبل تدمير نشاط. دائمًا بعد onStop()

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

للحصول على إرشادات إضافية حول استخدام هذه الطرق، يمكنك الاطّلاع على التطبيق التجريبي لحزمة تطوير البرامج (SDK) للتنقّل.

في حال استخدام NavigationView، يجب استدعاء الأحداث التي تتم في مراحل النشاط من النشاط أو الجزء، وليس من كليهما

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

تعديل من SupportNavigationFragment إلى NavigationFragment

بدءًا من الإصدار 8.0.0 من حزمة تطوير البرامج (SDK) للتنقّل، يحلّ NavigationFragment محلّ SupportNavigationFragment الذي تم إيقافه نهائيًا كحاوية الأجزاء العادية للاتجاهات المفصّلة وعرض الخريطة.

NavigationFragment يحافظ على التكافؤ الكامل لواجهة برمجة التطبيقات مع SupportNavigationFragment. لتحديث تطبيقك، استبدِل SupportNavigationFragment بـ NavigationFragment في ملفات تنسيق XML وعمليات استيراد الرمز المصدر. وستبقى جميع توقيعات الطرق وطلبات getSupportFragmentManager() متطابقة.

تعديل ملف XML للتنسيق

استبدِل SupportNavigationFragment بـ NavigationFragment في ملفات XML الخاصة بالتنسيق:

قبل (الإصدار 7.x والإصدارات الأقدم):

<fragment
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/navigation_fragment"
    android:name="com.google.android.libraries.navigation.SupportNavigationFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

بعد (الإصدار 8.0.0 والإصدارات الأحدث):

<fragment
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/navigation_fragment"
    android:name="com.google.android.libraries.navigation.NavigationFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

إذا كان تطبيقك يستخدم FragmentContainerView (يُنصح به لاستضافة الأجزاء)، يُرجى تعديل السمة android:name:

<androidx.fragment.app.FragmentContainerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/navigation_fragment"
    android:name="com.google.android.libraries.navigation.NavigationFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

تعديل الرمز البرمجي للتطبيق

استبدِل عمليات الاستيراد وتحويلات الفئات في رمز Java أو Kotlin. بما أنّ كلا الفئتَين توسّعان androidx.fragment.app.Fragment، يمكنك مواصلة استخدام getSupportFragmentManager() للبحث عن الجزء:

قبل (الإصدار 7.x والإصدارات الأقدم):

جافا

import com.google.android.libraries.navigation.SupportNavigationFragment;

public class MainActivity extends AppCompatActivity {
  private SupportNavigationFragment mNavFragment;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mNavFragment = (SupportNavigationFragment) getSupportFragmentManager()
        .findFragmentById(R.id.navigation_fragment);
  }
}
    

Kotlin

import com.google.android.libraries.navigation.SupportNavigationFragment

class MainActivity : AppCompatActivity() {
  private lateinit var navFragment: SupportNavigationFragment

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    navFragment = supportFragmentManager
        .findFragmentById(R.id.navigation_fragment) as SupportNavigationFragment
  }
}
    

بعد (الإصدار 8.0.0 والإصدارات الأحدث):

جافا

import com.google.android.libraries.navigation.NavigationFragment;

public class MainActivity extends AppCompatActivity {
  private NavigationFragment mNavFragment;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mNavFragment = (NavigationFragment) getSupportFragmentManager()
        .findFragmentById(R.id.navigation_fragment);
  }
}
    

Kotlin

import com.google.android.libraries.navigation.NavigationFragment

class MainActivity : AppCompatActivity() {
  private lateinit var navFragment: NavigationFragment

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    navFragment = supportFragmentManager
        .findFragmentById(R.id.navigation_fragment) as NavigationFragment
  }
}
    

تكافؤ واجهة برمجة التطبيقات

ولست بحاجة إلى إجراء أي تغييرات أخرى على السلوك أو إعادة هيكلة الرمز البرمجي. تتيح واجهة NavigationFragment استخدام جميع الطرق العامة وواجهات المستمعين وعناصر التحكّم المخصّصة في واجهة المستخدم من SupportNavigationFragment مع توقيعات طرق متطابقة (بما في ذلك getMapAsync() وgetNavigator() وsetEtaCardEnabled() وsetStylingOptions()).