Praktik terbaik interaksi peta navigasi

Halaman ini menjelaskan praktik terbaik untuk berinteraksi dengan peta Navigasi di aplikasi Anda.

Gunakan NavigationFragment, bukan NavigationView, jika memungkinkan

NavigationFragment membungkus NavigationView dan secara otomatis menangani callback siklus prosesnya, sehingga Anda tidak perlu mengelolanya sendiri. Pendekatan ini tidak terlalu rentan terhadap error dan merupakan cara yang direkomendasikan untuk menggunakan navigasi di aplikasi Anda. Saat menggunakan NavigationFragment, jangan panggil peristiwa siklus proses NavigationView secara langsung.

Jika menggunakan NavigationView, gunakan pengurutan yang ketat saat memanggil metode siklus proses

NavigationView menghosting peta Navigasi dan mengikuti peristiwa siklus proses dengan cermat seperti aktivitas dan fragmen Android, serta melakukan tindakan tertentu saat peristiwa siklus proses ini dipanggil. NavigationView menjalankan beberapa inisialisasi di NavigationView#onCreate dan NavigationView#onStart, serta pembersihan di NavigationView#onStop dan NavigationView#onDestroy, serta saat peristiwa siklus proses lainnya diproses.

Metode siklus proses NavigationView memiliki arti yang sama seperti untuk aktivitas atau fragmen Android. Misalnya, onCreate dari NavigationView kira-kira diterjemahkan ke dan harus dipanggil oleh callback siklus proses dari aktivitas atau fragmen Android. Karena callback siklus proses NavigationView didasarkan pada dan dipanggil dalam urutan yang sama dengan callback siklus proses Android, urutan yang ketat dari metode NavigationView ini diperlukan. Jika tidak, Anda mungkin mengalami kebocoran memori, error UI, lokasi tidak diperbarui, dan masalah lainnya.

Untuk mengetahui informasi selengkapnya tentang siklus proses aktivitas Android, lihat bagian Konsep siklus proses aktivitas di dokumentasi developer Android.

Tabel berikut menunjukkan kapan metode siklus proses lainnya harus dipanggil, setelah metode siklus proses tertentu:

Metode siklus proses Dipanggil di mana dalam siklus proses aktivitas Dipanggil setelah metode siklus proses yang mana
onConfigurationChanged() Dipanggil saat UI berada di latar depan dan konfigurasi berubah. Selalu setelah onStart()
onTrimMemory() Dipanggil saat aktivitas berada di latar belakang. Selalu setelah onPause()
onSaveInstance() Dipanggil sebelum aktivitas dihancurkan. Selalu setelah onStop()

Jangan panggil metode siklus proses ini beberapa kali tanpa memanggil metode penutupan yang sesuai terlebih dahulu. Selain itu, perlu diingat bahwa jika beberapa callback siklus proses Android ini dikelola oleh aplikasi itu sendiri, dan NavigationView ditambahkan ke fragmen setelah pembuatan atau mulai, aplikasi harus memanggil metode tertentu dalam urutan yang benar untuk menginisialisasi Navigation SDK dengan benar.

Untuk panduan tambahan tentang cara menggunakan metode ini, lihat aplikasi demo Navigation SDK.

Jika menggunakan NavigationView, panggil peristiwa siklus proses dari aktivitas atau fragmen, bukan keduanya

Untuk mempertahankan pengurutan metode siklus proses yang ketat, panggil peristiwa ini dari callback siklus proses aktivitas atau fragmen, yang menerima peristiwa ini secara berurutan. Pendekatan ini memastikan bahwa aplikasi tidak perlu berkoordinasi antara fragmen dan aktivitas serta menyebabkan panggilan duplikat.

Update dari SupportNavigationFragment ke NavigationFragment

Mulai Navigation SDK v8.0.0, NavigationFragment menggantikan SupportNavigationFragment yang tidak digunakan lagi sebagai penampung fragmen standar untuk navigasi belokan demi belokan dan tampilan peta.

NavigationFragment mempertahankan paritas API penuh dengan SupportNavigationFragment. Untuk memperbarui aplikasi, ganti SupportNavigationFragment dengan NavigationFragment dalam file tata letak XML dan impor kode sumber Anda. Semua tanda tangan metode dan panggilan getSupportFragmentManager() tetap identik.

Memperbarui XML tata letak

Ganti SupportNavigationFragment dengan NavigationFragment di file XML tata letak Anda:

Sebelumnya (v7.x dan yang lebih lama):

<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" />

Setelah (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" />

Jika aplikasi Anda menggunakan FragmentContainerView (direkomendasikan untuk menghosting fragmen), perbarui atribut 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" />

Memperbarui kode aplikasi

Ganti impor dan transmisi class dalam kode Java atau Kotlin Anda. Karena kedua class memperluas androidx.fragment.app.Fragment, terus gunakan getSupportFragmentManager() untuk mencari fragmen:

Sebelumnya (v7.x dan yang lebih lama):

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
  }
}
    

Setelah (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
  }
}
    

Paritas API

Anda tidak perlu membuat perubahan perilaku lainnya atau menyusun ulang kode. NavigationFragment mendukung semua metode publik, antarmuka pemroses, dan kontrol UI kustom dari SupportNavigationFragment dengan tanda tangan metode yang identik (termasuk getMapAsync(), getNavigator(), setEtaCardEnabled(), dan setStylingOptions()).