Questa pagina illustra le best practice per l'interazione con la mappa di navigazione nella tua app.
Utilizza NavigationFragment anziché NavigationView, quando possibile
NavigationFragment aggrega NavigationView e gestisce automaticamente i suoi
callback del ciclo di vita, quindi non è necessario gestirli manualmente. Questo approccio è meno soggetto a errori ed è il modo consigliato per utilizzare la navigazione nella tua app. Quando utilizzi NavigationFragment, non richiamare direttamente gli eventi del ciclo di vita di NavigationView.
Se utilizzi NavigationView, utilizza l'ordinamento rigoroso quando richiami i metodi del ciclo di vita
NavigationView ospita la mappa di navigazione e segue da vicino gli eventi del ciclo di vita come attività e frammenti Android, intraprendendo azioni specifiche quando vengono richiamati questi eventi del ciclo di vita. NavigationView esegue più inizializzazioni su NavigationView#onCreate e NavigationView#onStart e pulizie su NavigationView#onStop e NavigationView#onDestroy, nonché quando vengono elaborati altri eventi del ciclo di vita.
I metodi del ciclo di vita di NavigationView hanno lo stesso significato di quelli per le attività o i frammenti Android. Ad esempio, onCreate di NavigationView si traduce approssimativamente in e deve essere richiamato dai callback del ciclo di vita dell'attività o del frammento Android. Poiché i callback del ciclo di vita di NavigationView si basano sui callback del ciclo di vita di Android e vengono richiamati nello stesso ordine, è necessario un ordine rigoroso di questi metodi di NavigationView. In caso contrario, potresti riscontrare perdite di memoria, errori della UI, mancato aggiornamento della posizione e altri problemi.
Per saperne di più sul ciclo di vita delle attività Android, consulta la sezione Concetti relativi al ciclo di vita delle attività nella documentazione per lo sviluppo Android.
La tabella seguente mostra quando devono essere richiamati altri metodi del ciclo di vita, dopo i metodi del ciclo di vita specificati:
| Metodo del ciclo di vita | Invocato in quale fase del ciclo di vita dell'attività | Richiamato dopo quale metodo del ciclo di vita |
|---|---|---|
onConfigurationChanged()
|
Viene richiamato quando la UI è in primo piano e la configurazione cambia. | Sempre dopo onStart()
|
onTrimMemory()
|
Viene richiamato quando un'attività è in background. | Sempre dopo il giorno onPause()
|
onSaveInstance()
|
Viene richiamato prima che un'attività venga eliminata. | Sempre dopo onStop()
|
Non chiamare questi metodi del ciclo di vita più volte senza prima chiamare il metodo di chiusura corrispondente. Inoltre, tieni presente che se alcuni di questi callback del ciclo di vita di Android sono gestiti dall'app stessa e NavigationView viene aggiunto al frammento dopo la creazione o l'avvio, l'app deve chiamare i metodi specifici nell'ordine corretto per inizializzare correttamente l'SDK di navigazione.
Per ulteriori indicazioni sull'utilizzo di questi metodi, consulta l'app demo di SDK Navigation.
Se utilizzi NavigationView, richiama gli eventi del ciclo di vita dall'attività o dal frammento, non da entrambi
Per mantenere l'ordine rigoroso dei metodi del ciclo di vita, richiama questi eventi dai callback del ciclo di vita dell'attività o del frammento, che ricevono questi eventi in ordine. Questo approccio garantisce che le app non debbano coordinarsi tra frammenti e attività e causare chiamate duplicate.
Aggiorna da SupportNavigationFragment a NavigationFragment
A partire dalla versione 8.0.0 dell'SDK Navigation, NavigationFragment sostituisce il
SupportNavigationFragment deprecato come contenitore di frammenti standard per
la navigazione passo passo e la visualizzazione della mappa.
NavigationFragment mantiene la parità completa dell'API con SupportNavigationFragment.
Per aggiornare l'app, sostituisci SupportNavigationFragment con NavigationFragment nei file di layout XML e nelle importazioni del codice sorgente. Tutte le firme dei metodi e le chiamate getSupportFragmentManager() rimangono invariate.
Aggiorna il file XML del layout
Sostituisci SupportNavigationFragment con NavigationFragment nei file XML del layout:
Prima (v7.x e versioni precedenti):
<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" />
Dopo (v8.0.0 e versioni successive):
<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" />
Se la tua app utilizza FragmentContainerView (consigliato per l'hosting di frammenti), aggiorna l'attributo 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" />
Aggiorna il codice dell'applicazione
Sostituisci le importazioni e i cast di classe nel codice Java o Kotlin. Poiché entrambe le classi estendono androidx.fragment.app.Fragment, continua a utilizzare getSupportFragmentManager() per cercare il frammento:
Prima (v7.x e versioni precedenti):
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 } }
Dopo (v8.0.0 e versioni successive):
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 } }
Parità delle API
Non è necessario apportare altre modifiche al comportamento o ristrutturare il codice.
NavigationFragment supporta tutti i metodi pubblici, le interfacce listener e i controlli UI personalizzati di SupportNavigationFragment con firme dei metodi identiche (tra cui getMapAsync(), getNavigator(), setEtaCardEnabled() e setStylingOptions()).