หน้านี้อธิบายแนวทางปฏิบัติแนะนำในการโต้ตอบกับแผนที่การนำทางในแอป
ใช้ NavigationFragment แทน NavigationView เมื่อเป็นไปได้
NavigationFragment จะห่อหุ้ม NavigationView และจัดการการเรียกกลับของวงจร
โดยอัตโนมัติ คุณจึงไม่ต้องจัดการด้วยตนเอง วิธีนี้มีโอกาสเกิดข้อผิดพลาดน้อยกว่าและเป็นวิธีที่แนะนำในการใช้การนำทางในแอป
เมื่อใช้ NavigationFragment อย่าเรียกใช้เหตุการณ์วงจรของ NavigationView โดยตรง
หากใช้ NavigationView ให้ใช้การจัดลำดับที่เข้มงวดเมื่อเรียกใช้เมธอดวงจรของออบเจ็กต์
NavigationView จะโฮสต์แผนที่การนำทางและติดตามวงจร
เหตุการณ์อย่างใกล้ชิดในฐานะกิจกรรมและ Fragment ของ Android โดยจะดำเนินการที่เฉพาะเจาะจงเมื่อมีการเรียกใช้
เหตุการณ์วงจรเหล่านี้ NavigationView จะดำเนินการเริ่มต้นหลายครั้ง
ใน NavigationView#onCreate และ NavigationView#onStart รวมถึงการล้างข้อมูลใน
NavigationView#onStop และ NavigationView#onDestroy ตลอดจนเมื่อมีการประมวลผลเหตุการณ์วงจร
อื่นๆ
NavigationViewมีวิธีการวงจรเดียวกันกับที่ใช้สำหรับกิจกรรมหรือ Fragment ของ Android
เช่น onCreate ของ NavigationView โดยประมาณ
จะแปลเป็นและควรเรียกใช้โดย Lifecycle Callback จากกิจกรรมหรือ Fragment ของ Android เนื่องจากNavigationViewการเรียกกลับของวงจร
อิงตามและเรียกใช้ตามลำดับเดียวกับการเรียกกลับของวงจร Android
จึงต้องมีการจัดลำดับที่แน่นอนของเมธอด NavigationView เหล่านี้ มิเช่นนั้น คุณอาจพบหน่วยความจำ
รั่ว ข้อผิดพลาดของ UI
ตำแหน่งไม่อัปเดต และปัญหาอื่นๆ
ดูข้อมูลเพิ่มเติมเกี่ยวกับวงจรกิจกรรม Android ได้ที่ส่วนแนวคิดเกี่ยวกับวงจรกิจกรรมในเอกสารประกอบสำหรับนักพัฒนาซอฟต์แวร์ Android
ตารางต่อไปนี้แสดงเวลาที่ควรเรียกใช้วิธีการวงจรอื่นๆ หลังจากวิธีการวงจรที่ระบุ
| วิธีการวงจรลูกค้า | เรียกใช้ในวงจรกิจกรรม | เรียกใช้หลังจากเมธอดวงจรใด |
|---|---|---|
onConfigurationChanged()
|
เรียกใช้เมื่อ UI อยู่ในเบื้องหน้าและการกำหนดค่ามีการเปลี่ยนแปลง | หลังวันที่ onStart() เสมอ
|
onTrimMemory()
|
เรียกใช้เมื่อกิจกรรมอยู่ในเบื้องหลัง | หลังวันที่ onPause() เสมอ
|
onSaveInstance()
|
เรียกใช้ก่อนที่จะทำลายกิจกรรม | หลัง onStop()เสมอ
|
อย่าเรียกใช้เมธอดวงจรนี้หลายครั้งโดยไม่เรียกใช้เมธอดปิดที่เกี่ยวข้องก่อน นอกจากนี้ โปรดทราบว่าหากแอปจัดการการเรียกกลับวงจรของ Android บางรายการเหล่านี้ และมีการเพิ่ม NavigationView ลงใน Fragment หลังจากสร้างหรือเริ่มต้น แอปควรเรียกใช้เมธอดที่เฉพาะเจาะจงตามลำดับที่ถูกต้องเพื่อเริ่มต้น Navigation SDK อย่างถูกต้อง
ดูคำแนะนำเพิ่มเติมเกี่ยวกับการใช้วิธีการเหล่านี้ได้ในแอปเดโม Navigation SDK
หากใช้ NavigationView ให้เรียกใช้เหตุการณ์วงจรจากกิจกรรมหรือ Fragment อย่างใดอย่างหนึ่ง
หากต้องการรักษลําดับที่เข้มงวดของเมธอดวงจร ให้เรียกใช้เหตุการณ์เหล่านี้จาก การเรียกกลับของวงจรกิจกรรมหรือ Fragment ซึ่งจะรับเหตุการณ์เหล่านี้ ตามลําดับ แนวทางนี้ช่วยให้มั่นใจได้ว่าแอปไม่จำเป็นต้องประสานงานระหว่าง 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())