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 opakowuje NavigationView i automatycznie obsługuje wywołania zwrotne cyklu ż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. Gdy używasz 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 jako aktywności i fragmenty Androida, podejmując określone działania po wywołaniu tych zdarzeń. NavigationView wykonuje wiele inicjalizacji w NavigationView#onCreate i NavigationView#onStart oraz czyszczeń w NavigationView#onStop i NavigationView#onDestroy, a także podczas przetwarzania innych zdarzeń cyklu życia.

Metody cyklu życia NavigationView mają takie samo znaczenie jak w przypadku działań lub fragmentów na Androidzie. Na przykład onCreate z NavigationView można mniej więcej przełożyć na wywołania zwrotne cyklu życia z aktywności lub fragmentu Androida i powinno być przez nie wywoływane. Wywołania zwrotne cyklu życia NavigationView są oparte na wywołaniach zwrotnych cyklu życia Androida i są wywoływane w tej samej kolejności, dlatego 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 Pojęcia związane z cyklem życia aktywności w dokumentacji dla deweloperów aplikacji na Androida.

Tabela poniżej pokazuje, kiedy należy wywołać inne metody cyklu życia po określonych metodach cyklu życia:

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

Nie wywołuj tych metod cyklu życia wielokrotnie bez uprzedniego wywołania odpowiedniej metody zamykania. 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 utworzeniu lub uruchomieniu, aplikacja powinna wywoływać określone metody w odpowiedniej kolejności, aby prawidłowo zainicjować pakiet Navigation SDK.

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, ale nie z obu tych poziomów.

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

Aktualizacja z: SupportNavigationFragment do: NavigationFragment

Od wersji 8.0.0 pakietu Navigation SDK NavigationFragment zastępuje wycofany SupportNavigationFragment jako standardowy kontener fragmentów do szczegółowej nawigacji 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ą takie same.

Aktualizowanie kodu XML układu

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

Przed (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 lub nowsza):

<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 aplikacja używa FragmentContainerView (zalecane do 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. Obie klasy rozszerzają androidx.fragment.app.Fragment, więc nadal używaj getSupportFragmentManager() do wyszukiwania fragmentu:

Przed (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 lub nowsza):

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 zachowaniu ani restrukturyzować kodu. NavigationFragment obsługuje wszystkie metody publiczne, interfejsy detektorów i niestandardowe elementy sterujące interfejsu z SupportNavigationFragment z identycznymi sygnaturami metod (w tym getMapAsync(), getNavigator(), setEtaCardEnabled() i setStylingOptions()).