แนวทางปฏิบัติแนะนำสำหรับการโต้ตอบกับแผนที่การนำทาง

หน้านี้อธิบายแนวทางปฏิบัติแนะนำในการโต้ตอบกับแผนที่การนำทางในแอป

ใช้ 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())