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