Sprawdzone metody korzystania z mapy nawigacyjnej

Na tej stronie znajdziesz sprawdzone metody interakcji z mapą nawigacyjną w aplikacji.

W miarę możliwości używaj NavigationFragment zamiast NavigationView.

NavigationFragment otacza NavigationView i automatycznie obsługuje wywołania zwrotne związane z cyklem życia, więc nie musisz nimi zarządzać samodzielnie. To podejście jest mniej podatne na błędy i jest zalecanym sposobem korzystania z nawigacji w aplikacji. Podczas korzystania z NavigationFragment nie wywołuj bezpośrednio zdarzeń cyklu życia NavigationView.

Jeśli używasz NavigationView, podczas wywoływania metod cyklu życia stosuj ścisłą kolejność.

NavigationView hostuje mapę nawigacji i ściśle śledzi zdarzenia cyklu życia, takie jak działania i fragmenty Androida, podejmując określone działania po wywołaniu tych zdarzeń. NavigationView wykonuje wiele inicjalizacji na platformach NavigationView#onCreate i NavigationView#onStart oraz czyszczenie na platformach NavigationView#onStop i NavigationView#onDestroy, a także podczas przetwarzania innych zdarzeń związanych z cyklem życia.

Metody cyklu życia NavigationViewmają takie samo znaczenie jak w przypadku działań lub fragmentów na Androidzie. Na przykład onCreate w przybliżeniu NavigationView odpowiada wywołaniom zwrotnym cyklu życia z aktywności lub fragmentu Androida i powinno być przez nie wywoływane. Ponieważ wywołania zwrotne cyklu życia NavigationView są oparte na wywołaniach zwrotnych cyklu życia Androida i wywoływane w tej samej kolejności, wymagane jest ścisłe uporządkowanie tych metod NavigationView. W przeciwnym razie mogą wystąpić wycieki pamięci, błędy interfejsu, brak aktualizacji lokalizacji i inne problemy.

Więcej informacji o cyklu życia aktywności na Androidzie znajdziesz w sekcji Koncepcje cyklu życia aktywności w dokumentacji dla deweloperów Androida.

W tabeli poniżej pokazujemy, kiedy należy wywoływać inne metody cyklu życia po określonych metodach cyklu życia:

Metoda cyklu życia Wywoływane w cyklu życia działania Wywoływana po której metodzie cyklu życia
onConfigurationChanged() Wywoływana, gdy interfejs jest na pierwszym planie i zmienia się konfiguracja. Zawsze po onStart()
onTrimMemory() Wywoływana, gdy aktywność jest w tle. Zawsze po onPause()
onSaveInstance() Wywoływana przed zniszczeniem aktywności. Zawsze po onStop()

Nie wywołuj tych metod cyklu życia wielokrotnie bez wcześniejszego wywołania odpowiedniej metody zamykającej. Pamiętaj też, że jeśli niektóre z tych wywołań zwrotnych cyklu życia Androida są zarządzane przez samą aplikację, a NavigationView jest dodawany do fragmentu po jego utworzeniu lub uruchomieniu, aplikacja powinna wywoływać poszczególne metody w odpowiedniej kolejności, aby prawidłowo zainicjować pakiet SDK nawigacji.

Dodatkowe wskazówki dotyczące korzystania z tych metod znajdziesz w aplikacji demonstracyjnej pakietu Navigation SDK.

Jeśli używasz NavigationView, wywołuj zdarzenia cyklu życia z poziomu aktywności lub fragmentu, a nie obu tych elementów.

Aby zachować ścisłą kolejność metod cyklu życia, wywołuj te zdarzenia z wywołań zwrotnych cyklu życia działania lub fragmentu, które odbierają te zdarzenia w odpowiedniej kolejności. Dzięki temu aplikacje nie muszą koordynować działań między fragmentami i aktywnościami, co zapobiega duplikowaniu wywołań.

Zaktualizuj z SupportNavigationFragment do NavigationFragment

Od wersji 8.0.0 pakietu Navigation SDK element NavigationFragment zastępuje wycofany element SupportNavigationFragment jako standardowy kontener fragmentów na potrzeby nawigacji krok po kroku i wyświetlania mapy.

NavigationFragment zachowuje pełną zgodność interfejsu API z SupportNavigationFragment. Aby zaktualizować aplikację, zastąp SupportNavigationFragment ciągiem NavigationFragment w plikach układu XML i importach kodu źródłowego. Wszystkie sygnatury metod i wywołania getSupportFragmentManager() pozostają identyczne.

Aktualizowanie kodu XML układu

W plikach XML układu zastąp SupportNavigationFragment ciągiem NavigationFragment:

Wcześniej (wersja 7.x i starsze):

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

Po (wersja 8.0.0 i nowsze):

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

Jeśli Twoja aplikacja używa FragmentContainerView (zalecane w przypadku hostowania fragmentów), zaktualizuj atrybut 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" />

Aktualizowanie kodu aplikacji

Zastąp importy i rzutowania klas w kodzie Java lub Kotlin. Ponieważ obie klasy rozszerzają klasę androidx.fragment.app.Fragment, nadal używaj getSupportFragmentManager() do wyszukiwania fragmentu:

Wcześniej (wersja 7.x i starsze):

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

Po (wersja 8.0.0 i nowsze):

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

Równoważność interfejsów API

Nie musisz wprowadzać żadnych innych zmian w sposobie działania ani restrukturyzować kodu. NavigationFragment obsługuje wszystkie metody publiczne, interfejsy odbiorników i niestandardowe elementy sterujące interfejsu z SupportNavigationFragment o identycznych sygnaturach metod (w tym getMapAsync(), getNavigator(), setEtaCardEnabled() i setStylingOptions()).