หน้านี้อธิบายแนวทางปฏิบัติแนะนำสำหรับการโต้ตอบกับแผนที่การนำทางในแอป
ใช้ NavigationFragment แทน NavigationView หากเป็นไปได้
NavigationFragment จะรวม NavigationView และจัดการ Lifecycle Callback โดยอัตโนมัติ คุณจึงไม่ต้องจัดการด้วยตนเอง วิธีนี้มีแนวโน้มที่จะเกิดข้อผิดพลาดน้อยกว่าและเป็นวิธีที่แนะนำในการใช้การนำทางในแอป เมื่อใช้ NavigationFragment อย่าเรียกใช้เหตุการณ์ในวงจร NavigationView โดยตรง
หากใช้ NavigationView ให้ใช้การจัดลำดับที่เข้มงวดเมื่อเรียกใช้เมธอดวงจร
NavigationView โฮสต์แผนที่การนำทางและติดตามเหตุการณ์ในวงจรอย่างใกล้ชิดเป็นกิจกรรมและ Fragment ของ Android โดยจะดำเนินการเฉพาะเมื่อมีการเรียกใช้เหตุการณ์ในวงจรเหล่านี้ NavigationView จะดำเนินการเริ่มต้นหลายครั้งใน NavigationView#onCreate และ NavigationView#onStart รวมถึงล้างข้อมูลใน NavigationView#onStop และ NavigationView#onDestroy ตลอดจนเมื่อมีการประมวลผลเหตุการณ์ในวงจรอื่นๆ
เมธอดวงจรชีวิตของ NavigationView มีความหมายเหมือนกับเมธอดวงจรชีวิตของกิจกรรมหรือ Fragment ของ Android ตัวอย่างเช่น onCreate ของ NavigationView แปลได้คร่าวๆ ว่าควรเรียกใช้โดย Lifecycle Callback จากกิจกรรมหรือ Fragment ของ Android เนื่องจาก Lifecycle Callback ของ NavigationView อิงตามและเรียกใช้ในลำดับเดียวกับ Lifecycle Callback ของ Android คุณจึงต้องจัดลำดับเมธอด NavigationView เหล่านี้อย่างเคร่งครัด มิฉะนั้น คุณอาจพบปัญหาหน่วยความจำรั่วไหล, ข้อผิดพลาดเกี่ยวกับ UI, ตำแหน่งไม่อัปเดต และปัญหาอื่นๆ
ดูข้อมูลเพิ่มเติมเกี่ยวกับวงจรกิจกรรมของ Android ได้ที่ส่วนแนวคิดเกี่ยวกับวงจรกิจกรรมในเอกสารประกอบสำหรับนักพัฒนาแอป Android
ตารางต่อไปนี้แสดงกรณีที่ควรเรียกใช้เมธอดวงจรอื่นๆ หลังจากเมธอดวงจรที่ระบุ
| เมธอดวงจร | เรียกใช้ในวงจรกิจกรรม | เรียกใช้หลังจากเมธอดวงจรใด |
|---|---|---|
onConfigurationChanged()
|
เรียกใช้เมื่อ UI อยู่ในเบื้องหน้าและการกำหนดค่ามีการเปลี่ยนแปลง | หลังวันที่ onStart() เสมอ
|
onTrimMemory()
|
เรียกใช้เมื่อกิจกรรมอยู่ในเบื้องหลัง | หลังวันที่ onPause() เสมอ
|
onSaveInstance()
|
เรียกใช้ก่อนที่กิจกรรมจะถูกทำลาย | หลัง onStop()เสมอ
|
อย่าเรียกใช้เมธอดวงจรเหล่านี้หลายครั้งโดยไม่เรียกใช้เมธอดการปิดที่เกี่ยวข้องก่อน นอกจากนี้ โปรดทราบว่าหากแอปเป็นผู้จัดการ Lifecycle Callback ของ Android บางรายการ และมีการเพิ่ม NavigationView ลงใน Fragment หลังจากสร้างหรือเริ่มต้น แอปควรเรียกใช้เมธอดที่เฉพาะเจาะจงตามลำดับที่เหมาะสมเพื่อเริ่มต้น Navigation SDK อย่างถูกต้อง
ดูคำแนะนำเพิ่มเติมเกี่ยวกับการใช้วิธีการเหล่านี้ได้ที่แอปเดโมของ Navigation SDK
หากใช้ NavigationView ให้เรียกใช้เหตุการณ์ในวงจรจากกิจกรรมหรือ Fragment อย่างใดอย่างหนึ่ง ไม่ใช่ทั้ง 2 อย่าง
หากต้องการรักษาลำดับที่เข้มงวดของเมธอดวงจร ให้เรียกใช้เหตุการณ์เหล่านี้จาก Lifecycle Callback ของกิจกรรมหรือ Fragment ซึ่งจะรับเหตุการณ์เหล่านี้ตามลำดับ วิธีนี้ช่วยให้มั่นใจว่าแอปไม่จำเป็นต้องประสานงานระหว่างส่วนย่อยและกิจกรรมต่างๆ และทำให้เกิดการเรียกซ้ำ
อัปเดตจาก SupportNavigationFragment เป็น NavigationFragment
ตั้งแต่ Navigation SDK v8.0.0 เป็นต้นไป NavigationFragment จะแทนที่ SupportNavigationFragment ที่เลิกใช้งานแล้วเป็นคอนเทนเนอร์ Fragment มาตรฐานสำหรับการนำทางแบบเลี้ยวต่อเลี้ยวและการแสดงแผนที่
NavigationFragment มีความเท่าเทียมกันของ API กับ SupportNavigationFragment อย่างสมบูรณ์
หากต้องการอัปเดตแอป ให้แทนที่ SupportNavigationFragment ด้วย NavigationFragment ในไฟล์เลย์เอาต์ XML และการนําเข้าซอร์สโค้ด ลายเซ็นเมธอดและการเรียก getSupportFragmentManager() ทั้งหมดจะยังคงเหมือนเดิม
อัปเดต XML ของเลย์เอาต์
แทนที่ SupportNavigationFragment ด้วย NavigationFragment ในไฟล์ XML ของเลย์เอาต์:
ก่อน (v7.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" />
หลัง (v8.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 (แนะนำสำหรับการโฮสต์ 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" />
อัปเดตโค้ดของแอปพลิเคชัน
แทนที่การนําเข้าและการแคสต์คลาสในโค้ด Java หรือ Kotlin เนื่องจากทั้ง 2 คลาสขยาย androidx.fragment.app.Fragment ให้ใช้ getSupportFragmentManager() ต่อไปเพื่อค้นหา Fragment ดังนี้
ก่อน (v7.x และก่อนหน้า):
Java
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 } }
หลัง (v8.0.0 ขึ้นไป):
Java
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 } }
ความเท่าเทียมกันของ API
คุณไม่จำเป็นต้องทำการเปลี่ยนแปลงลักษณะการทำงานอื่นๆ หรือปรับโครงสร้างโค้ดใหม่
NavigationFragment รองรับเมธอดสาธารณะ, อินเทอร์เฟซ Listener และตัวควบคุม UI ที่กำหนดเองทั้งหมดจาก SupportNavigationFragment ที่มีซิกเนเจอร์เมธอดเหมือนกัน (รวมถึง getMapAsync(), getNavigator(), setEtaCardEnabled() และ setStylingOptions())