Esci dalle attività a schermo intero su Wear

Un utente può uscire da un'attività Wear OS scorrendo da sinistra a destra. Se nell'app è disponibile lo scorrimento orizzontale, l'utente esce andando al bordo dei contenuti e scorrendo da sinistra a destra. Premendo il tasto di accensione, l'utente torna alla visualizzazione del quadrante.

Il gesto di scorrimento per ignorare

Gli utenti devono scorrere il dito da sinistra a destra per chiudere la schermata corrente. Pertanto, consigliamo di utilizzare quanto segue:

  • Layout verticali
  • Contenitori di contenuti

Consigliamo inoltre di non includere nell'app gesti di scorrimento orizzontale.

Ignorare un'attività

Le attività supportano automaticamente lo scorrimento per ignorare. Se scorri un'attività da sinistra a destra, l'attività viene ignorata e l'app scende nello stack posteriore.

Ignorare un frammento

Per supportare la funzionalità di scorrimento per ignorare i frammenti, devi aggregare la visualizzazione contenente frammenti nella classe SwipeDismissFrameLayout. Tienilo presente quando decidi se utilizzare i frammenti. Utilizza la classe SwipeDismissFrameLayout come mostrato nell'esempio seguente:

Kotlin

class SwipeDismissFragment : Fragment() {
    private val callback = object : SwipeDismissFrameLayout.Callback() {
        override fun onSwipeStarted(layout: SwipeDismissFrameLayout) {
            // Optional
        }

        override fun onSwipeCanceled(layout: SwipeDismissFrameLayout) {
            // Optional
        }

        override fun onDismissed(layout: SwipeDismissFrameLayout) {
            // Code here for custom behavior, such as going up the
            // back stack and destroying the fragment but staying in the app.
        }
    }

    override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
    ): View =
            SwipeDismissFrameLayout(activity).apply {

                // If the fragment should fill the screen (optional), then in the layout file,
                // in the androidx.wear.widget.SwipeDismissFrameLayout element,
                // set the android:layout_width and android:layout_height attributes
                // to "match_parent".

                inflater.inflate(
                        R.layout.swipe_dismiss_frame_layout,
                        this,
                        false
                ).also { inflatedView ->
                    addView(inflatedView)
                }
                addCallback(callback)
            }
}

Java

public class SwipeDismissFragment extends Fragment {
  private final Callback callback =
    new Callback() {
      @Override
        public void onSwipeStart() {
          // Optional
        }

        @Override
        public void onSwipeCancelled() {
          // Optional
        }

        @Override
        public void onDismissed(SwipeDismissFrameLayout layout) {
          // Code here for custom behavior, such as going up the
          // back stack and destroying the fragment but staying in the app.
        }
      };

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    SwipeDismissFrameLayout swipeLayout = new SwipeDismissFrameLayout(getActivity());

    // If the fragment should fill the screen (optional), then in the layout file,
    // in the androidx.wear.widget.SwipeDismissFrameLayout element,
    // set the android:layout_width and android:layout_height attributes
    // to "match_parent".

    View inflatedView = inflater.inflate(R.layout.swipe_dismiss_frame_layout, swipeLayout, false);
    swipeLayout.addView(inflatedView);
    swipeLayout.addCallback(callback);

    return swipeLayout;
    }
}

Nota:quando utilizzi frammenti all'interno della tua attività, usa FragmentManager.add anziché FragmentManager.replace per supportare il gesto di scorrimento per ignorare. Ciò aiuta a garantire che il frammento precedente venga visualizzato sotto il frammento superiore mentre viene fatto scorrere.

Visualizzazioni scorrevoli orizzontali

In alcuni casi, ad esempio in una visualizzazione contenente una mappa che supporta il panning, l'interfaccia utente non può impedire lo scorrimento orizzontale. In questo scenario, sono disponibili due opzioni:

  • Se lo stack posteriore è breve, l'utente può chiudere l'app e tornare alla schermata Home del quadrante premendo il tasto di accensione.
  • Se vuoi che l'utente vada nello stack posteriore, puoi aggregare la visualizzazione in un oggetto SwipeDismissFrameLayout, che supporta lo scorrimento dai bordi. Lo scorrimento dai bordi è abilitato quando la vista o i relativi elementi secondari restituiscono true da una chiamata canScrollHorizontally(). Lo scorrimento dai bordi consente all'utente di chiudere la visualizzazione scorrendo dal 10% all'estrema sinistra dello schermo, anziché da qualsiasi punto della visualizzazione.

I seguenti esempi mostrano come aggregare una vista in un oggetto SwipeDismissFrameLayout:

<androidx.wear.widget.SwipeDismissFrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/swipe_dismiss_root" >

    <TextView
        android:id="@+id/test_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="Swipe me to dismiss me." />
</androidx.wear.widget.SwipeDismissFrameLayout>

Kotlin

activity?.findViewById<SwipeDismissFrameLayout>(R.id.swipe_dismiss_root)?.apply {
    addCallback(object : SwipeDismissFrameLayout.Callback() {

        override fun onDismissed(layout: SwipeDismissFrameLayout) {
            layout.visibility = View.GONE
        }
    })
}

Java

SwipeDismissFrameLayout testLayout =
    (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root);
testLayout.addCallback(new SwipeDismissFrameLayout.Callback() {
    @Override
    public void onDismissed(SwipeDismissFrameLayout layout) {
        layout.setVisibility(View.GONE);
    }
  }
);

Opzione sconsigliata: disattiva la funzionalità di scorrimento per ignorare

In genere sconsigliamo di disattivare la funzionalità di scorrimento per ignorare, poiché l'utente si aspetta di chiudere qualsiasi schermata con un gesto di scorrimento. In un caso eccezionale, puoi estendere il tema predefinito in una risorsa di stile e impostare l'attributo android:windowSwipeToDismiss su false, come mostrato nel seguente esempio di codice:

<resources>
  <style name="AppTheme" parent="@android:style/Theme.DeviceDefault">
    <item name="android:windowSwipeToDismiss">false</item>
  </style>
</resources>

Al primo utilizzo dell'app, potrai quindi comunicare agli utenti che possono uscire dall'app premendo il tasto di accensione.

Ignora con il tasto di accensione

La pressione del tasto di accensione fisico invia un evento relativo al tasto di accensione. Pertanto, non puoi utilizzare il tasto di accensione come pulsante Indietro o per la navigazione in generale.

Quando viene premuto, il tasto di accensione riporta l'utente alla schermata Home del quadrante. Esistono due eccezioni:

  • Se l'utente si trova in un IME (Input Method Editor), ad esempio una schermata di riconoscimento della scrittura a mano libera, la pressione del pulsante chiude l'IME e riporta l'utente all'app.
  • Se l'utente si trova dal quadrante, premendo il pulsante hardware si apre Avvio applicazioni.

Nota: quando premi il tasto di accensione, il metodo isFinishing() della classe Activity non restituisce true e non puoi intercettare l'evento chiave.

Per ulteriori informazioni, consulta Navigazione.