La navigazione a ritroso è il modo in cui gli utenti si spostano a ritroso nella cronologia delle schermate che hanno visitato. visitati in precedenza. Tutti i dispositivi Android dispongono di un pulsante Indietro per questo tipo di quindi non aggiungere un pulsante Indietro all'interfaccia utente della tua app. In base a sul dispositivo Android dell'utente, questo pulsante potrebbe essere un pulsante fisico o un software .
Android mantiene un back stack di destinazioni mentre l'utente naviga in tutta l'applicazione. In questo modo Android può accedere correttamente le destinazioni precedenti premendo il pulsante Indietro. Tuttavia, ci sono alcune casi in cui la tua app potrebbe dover implementare il proprio comportamento Indietro per offrire la migliore esperienza utente possibile.
Ad esempio, quando utilizzi un WebView
,
potresti voler eseguire l'override del comportamento predefinito del pulsante Indietro per consentire all'utente
navigare indietro nella cronologia di navigazione sul web anziché nelle schermate precedenti
all'interno dell'app.
Android 13 e versioni successive includono un gesto Indietro predittivo per i dispositivi Android. A Per saperne di più su questa funzionalità, consulta Aggiungere il supporto del gesto Indietro predittivo.
Implementare la navigazione a ritroso personalizzata
ComponentActivity
, la base
corso per FragmentActivity
e AppCompatActivity
,
consente di controllare il comportamento del pulsante Indietro utilizzando la relativa
OnBackPressedDispatcher
,
che puoi recuperare chiamando il numero getOnBackPressedDispatcher()
.
L'OnBackPressedDispatcher
controlla la modalità di invio degli eventi del pulsante Indietro
a uno o più OnBackPressedCallback
di oggetti strutturati. Il costruttore di OnBackPressedCallback
prende un valore booleano per
stato di attivazione iniziale. Se viene attivato un callback,
isEnabled()
restituisce true
; il supervisore chiama
handleOnBackPressed()
per gestire l'evento del pulsante Indietro. Puoi modificare lo stato di attivazione chiamando
setEnabled()
I callback vengono aggiunti utilizzando i metodi addCallback
. È consigliabile utilizzare
addCallback()
che richiede un LifecycleOwner
.
In questo modo ti assicuri che OnBackPressedCallback
venga aggiunto solo quando LifecycleOwner
è
Lifecycle.State.STARTED
L'attività rimuove anche i callback registrati quando sono associati
LifecycleOwner
viene eliminato, impedendo le perdite di memoria e rendendo
Idoneo per LifecycleOwner
per l'utilizzo in frammenti o altri proprietari del ciclo di vita con una durata più breve
dell'attività.
Ecco un esempio di implementazione di callback:
Kotlin
class MyFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // This callback is only called when MyFragment is at least started val callback = requireActivity().onBackPressedDispatcher.addCallback(this) { // Handle the back button event } // The callback can be enabled or disabled here or in the lambda } ... }
Java
public class MyFragment extends Fragment { @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // This callback is only called when MyFragment is at least started OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) { @Override public void handleOnBackPressed() { // Handle the back button event } }; requireActivity().getOnBackPressedDispatcher().addCallback(this, callback); // The callback can be enabled or disabled here or in handleOnBackPressed() } ... }
Puoi fornire più callback utilizzando addCallback()
.
Quando lo fai, i callback vengono richiamati in ordine inverso rispetto all'ordine in cui
aggiungerli: il callback aggiunto per ultimo è il primo che ha la possibilità di gestire
Evento pulsante Indietro. Ad esempio, se aggiungi tre callback denominati
one
, two
e three
, in quest'ordine, vengono richiamati nell'ordine
three
, two
e one
.
I callback seguono
Catena di responsabilità
pattern. Ogni callback nella catena viene chiamato solo se la precedente
il callback non è stato abilitato. Ciò significa che,
nell'esempio precedente, il callback two
viene chiamato solo se il callback three
non è attivato e il callback one
viene attivato solo se il callback two
non è abilitato.
Tieni presente che, quando il callback viene aggiunto utilizzando addCallback()
,
non viene aggiunta alla catena di responsabilità fino a quando
LifecycleOwner
entra nello stato Lifecycle.State.STARTED
.
Ti consigliamo di modificare lo stato di attivazione su OnBackPressedCallback
per modifiche temporanee, poiché così facendo mantiene l'ordine descritto sopra.
Ciò è particolarmente importante se hai callback registrati su più
proprietari del ciclo di vita nidificati.
Se vuoi rimuovere completamente OnBackPressedCallback
,
puoi chiamare
remove()
In genere questa operazione non è necessaria perché i callback vengono rimossi automaticamente quando
il suo LifecycleOwner
associato è
eliminato.
Attività suBackPressed()
Se utilizzi
onBackPressed()
per gestire gli eventi del pulsante Indietro, consigliamo di utilizzare
OnBackPressedCallback
.
Tuttavia, se non puoi apportare questa modifica, si applicano le seguenti regole:
- Tutti i callback registrati tramite
addCallback
vengono valutati quando chiamisuper.onBackPressed()
. - In Android 12 (livello API 32) e versioni precedenti, viene sempre chiamata
onBackPressed
, indipendentemente dalle istanze registrate diOnBackPressedCallback
.