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()).