این صفحه بهترین شیوهها برای تعامل با نقشه ناوبری در برنامه شما را توضیح میدهد.
هر زمان که امکان دارد، به جای NavigationView از NavigationFragment استفاده کنید.
NavigationFragment NavigationView را در بر میگیرد و به طور خودکار فراخوانیهای چرخه حیات آن را مدیریت میکند، بنابراین نیازی نیست خودتان آنها را مدیریت کنید. این رویکرد کمتر مستعد خطا است و روش پیشنهادی برای استفاده از navigation در برنامه شماست. هنگام استفاده از NavigationFragment ، رویدادهای چرخه حیات NavigationView مستقیماً فراخوانی نکنید.
اگر از NavigationView استفاده میکنید، هنگام فراخوانی متدهای چرخه عمر، از ترتیب دقیق استفاده کنید.
NavigationView میزبان نقشه ناوبری است و رویدادهای چرخه حیات را به عنوان فعالیتها و قطعات اندروید به دقت دنبال میکند و هنگام فراخوانی این رویدادهای چرخه حیات، اقدامات خاصی را انجام میدهد. NavigationView مقداردهیهای اولیه متعددی را در NavigationView#onCreate و NavigationView#onStart و پاکسازیها را در NavigationView#onStop و NavigationView#onDestroy و همچنین هنگام پردازش سایر رویدادهای چرخه حیات انجام میدهد.
متدهای چرخه حیات NavigationView همان معنایی را دارند که برای activityها یا fragmentهای اندروید دارند. برای مثال، onCreate مربوط به NavigationView تقریباً به callbackهای چرخه حیات از activity یا fragment اندروید ترجمه میشود و باید توسط آنها فراخوانی شود. از آنجایی که callbackهای چرخه حیات NavigationView بر اساس callbackهای چرخه حیات اندروید هستند و به همان ترتیب فراخوانی میشوند، ترتیب دقیق این متدهای NavigationView الزامی است. در غیر این صورت، ممکن است با نشت حافظه ، خطاهای UI، عدم بهروزرسانی مکان و سایر مشکلات مواجه شوید.
برای اطلاعات بیشتر در مورد چرخه حیات فعالیت اندروید، به بخش مفاهیم چرخه حیات فعالیت در مستندات توسعهدهندگان اندروید مراجعه کنید.
جدول زیر نشان میدهد که چه زمانی باید سایر متدهای چرخه حیات، پس از متدهای چرخه حیات مشخص شده، فراخوانی شوند:
| روش چرخه عمر | در هر کجای چرخه حیات اکتیویتی فراخوانی میشود | پس از کدام متد چرخه حیات فراخوانی میشود |
|---|---|---|
onConfigurationChanged() | زمانی که رابط کاربری در پیشزمینه قرار دارد و پیکربندی تغییر میکند، فراخوانی میشود. | همیشه بعد از onStart() |
onTrimMemory() | زمانی که یک فعالیت در پسزمینه است، فراخوانی میشود. | همیشه بعد از onPause() |
onSaveInstance() | قبل از اینکه یک اکتیویتی از بین برود، فراخوانی میشود. | همیشه بعد از onStop() |
این متدهای چرخه حیات را بدون فراخوانی متد پایانی مربوطه، چندین بار فراخوانی نکنید. علاوه بر این، به خاطر داشته باشید که اگر برخی از این فراخوانیهای چرخه حیات اندروید توسط خود برنامه مدیریت شوند و NavigationView پس از ایجاد یا شروع به فرگمنت اضافه شود، برنامه باید متدهای خاص را به ترتیب صحیح فراخوانی کند تا SDK ناوبری را به درستی مقداردهی اولیه کند.
برای راهنمایی بیشتر در مورد استفاده از این روشها، به نسخه آزمایشی برنامه Navigation SDK مراجعه کنید.
اگر از NavigationView استفاده میکنید، رویدادهای چرخه حیات را از activity یا fragment فراخوانی کنید، نه هر دو.
برای حفظ ترتیب دقیق متدهای چرخه حیات، این رویدادها را از فراخوانیهای چرخه حیات activity یا fragment که این رویدادها را به ترتیب دریافت میکنند، فراخوانی کنید. این رویکرد تضمین میکند که برنامهها نیازی به هماهنگی بین fragmentها و activityها نداشته باشند و باعث فراخوانیهای تکراری نشوند.
بهروزرسانی از SupportNavigationFragment به NavigationFragment
از نسخه ۸.۰.۰ کیت توسعه نرمافزاری ناوبری (Navigation SDK)، قطعه NavigationFragment جایگزین قطعه کد منسوخشده SupportNavigationFragment به عنوان کانتینر قطعه کد استاندارد برای ناوبری گام به گام و نمایش نقشه میشود.
NavigationFragment برابری کامل API را با SupportNavigationFragment حفظ میکند. برای بهروزرسانی برنامه خود، SupportNavigationFragment در فایلهای طرحبندی XML و وارد کردن کد منبع، با NavigationFragment جایگزین کنید. تمام امضاهای متد و فراخوانیهای getSupportFragmentManager() یکسان باقی میمانند.
طرح XML را بهروزرسانی کنید
در فایلهای XML طرحبندی خود SupportNavigationFragment با NavigationFragment جایگزین کنید:
قبل (نسخه ۷.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" />
بعد از (نسخه ۸.۰.۰+):
<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 استفاده میکند (که برای میزبانی fragmentها توصیه میشود)، ویژگی 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" />
کد برنامه را بهروزرسانی کنید
importها و class castها را در کد جاوا یا کاتلین خود جایگزین کنید. از آنجا که هر دو کلاس androidx.fragment.app.Fragment را ارثبری میکنند، همچنان از getSupportFragmentManager() برای جستجوی قطعه کد استفاده کنید:
قبل (نسخه ۷.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); } }
کاتلین
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 } }
بعد از (نسخه ۸.۰.۰+):
جاوا
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); } }
کاتلین
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 } }
برابری API
نیازی به ایجاد هیچ تغییر رفتاری دیگری یا تغییر ساختار کد خود ندارید. NavigationFragment از تمام متدهای عمومی، رابطهای شنونده و کنترلهای رابط کاربری سفارشی از SupportNavigationFragment با امضاهای متد یکسان (از جمله getMapAsync() ، getNavigator() ، setEtaCardEnabled() و setStylingOptions() ) پشتیبانی میکند.