Fornisci una navigazione a ritroso personalizzata

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 devi 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 di navigare indietro nella cronologia di navigazione sul web anziché nelle schermate precedenti all'interno dell'app.

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. Solo quando è attivato un callback (ad es. isEnabled() restituisce true), il supervisore chiamerà il handleOnBackPressed() per gestire l'evento del pulsante Indietro. Puoi modificare lo stato di attivazione chiamando setEnabled()

I callback vengono aggiunti con i metodi addCallback. Ti consigliamo vivamente di utilizza la 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 lo rende adatto per l'utilizzo in frammenti o altri proprietari del ciclo di vita con una durata più breve dell'attività.

Di seguito è riportato un esempio di implementazione del callback:

Kotlin

class MyFragment : Fragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // This callback will only be 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 will only be 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 effettuare più richiamate tramite addCallback(). Durante questa operazione, i callback vengono richiamati nell'ordine inverso in cui sono "Aggiunto", il callback aggiunto per ultimo è il primo che ha la possibilità di gestire Evento pulsante Indietro. Ad esempio, se hai aggiunto tre callback denominati one, two e three in ordine, verrebbero richiamati nell'ordine rispettivamente 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 verrebbe richiamato solo se il callback three non è stato abilitato. Il callback one verrà richiamato solo se il callback two non è stato abilitato e così via.

Tieni presente che, se lo aggiungi tramite addCallback(), il callback non viene aggiunto alla catena di responsabilità finché LifecycleOwner entra in Lifecycle.State.STARTED stato.

La modifica dello stato di attivazione su OnBackPressedCallback è fortemente consigliata per le modifiche temporanee, in quanto mantiene l'ordine descritto sopra. il che è particolarmente importante se hai callback registrati su più diversi proprietari nidificati del ciclo di vita.

Tuttavia, nei casi in cui vuoi rimuovere completamente OnBackPressedCallback, dovresti chiamare remove() Tuttavia, di solito non è necessario perché i callback vengono rimossi automaticamente quando l'elemento LifecycleOwner associato è eliminato.

Attività suBackPressed()

Se utilizzi onBackPressed() per gestire gli eventi del pulsante Indietro, consigliamo di utilizzare un OnBackPressedCallback. Tuttavia, se non riesci ad apportare questa modifica, si applicano le seguenti regole:

  • Tutti i callback registrati tramite addCallback vengono valutati quando chiami super.onBackPressed().
  • In Android 12 (livello API 32) e versioni precedenti, viene sempre chiamata onBackPressed, indipendentemente dalle istanze registrate di OnBackPressedCallback.