Esci dalle attività a schermo intero su Wear

Prova Compose
Jetpack Compose su Wear OS è il toolkit UI consigliato per Wear OS.

Un utente può uscire da un'attività Wear OS scorrendo da sinistra verso destra. Se l'app ha lo scorrimento orizzontale, l'utente esce navigando fino al bordo dei contenuti e poi scorrendo da sinistra a destra. Se premi il tasto di accensione, l'utente torna al quadrante.

Gesto di scorrimento per ignorare

Gli utenti scorrono da sinistra a destra per chiudere la schermata corrente. Pertanto, ti consigliamo di utilizzare quanto segue:

  • Layout verticali
  • Contenitori di contenuti

Ti consigliamo inoltre di non includere nella tua app gesti di scorrimento orizzontale.

Ignorare un'attività

Le attività supportano automaticamente lo scorrimento per chiudere. Se scorri un'attività da sinistra a destra, l'attività viene chiusa e l'app torna indietro nello stack di attività.

Ignorare un frammento

Per supportare lo scorrimento per chiudere nei fragment, devi racchiudere la visualizzazione contenente il fragment nella classe SwipeDismissFrameLayout. Tieni presente questo aspetto 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 i fragment all'interno dell'attività, utilizza FragmentManager.add anziché FragmentManager.replace per supportare il gesto di scorrimento per chiudere. In questo modo, il frammento precedente viene visualizzato sotto il frammento superiore mentre viene eliminato con uno scorrimento.

Visualizzazioni con scorrimento orizzontale

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

  • Se lo stack indietro è breve, l'utente può chiudere l'app e tornare alla schermata Home del quadrante premendo il tasto di accensione.
  • Se vuoi che l'utente torni indietro, puoi racchiudere la visualizzazione in un oggetto SwipeDismissFrameLayout, che supporta lo scorrimento dal bordo. Lo scorrimento dal bordo è attivato quando la visualizzazione o i relativi elementi secondari restituiscono true da una canScrollHorizontally() chiamata. Lo scorrimento dal bordo consente all'utente di chiudere la visualizzazione scorrendo dal 10% più a sinistra dello schermo, anziché da qualsiasi punto della visualizzazione.

Gli esempi seguenti mostrano come racchiudere una visualizzazione 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 non consigliata: disattivare lo scorrimento per chiudere

In genere non consigliamo di disattivare lo scorrimento per chiudere, perché l'utente si aspetta di chiudere qualsiasi schermata con uno 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 nell'esempio di codice seguente:

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

Puoi quindi informare gli utenti al primo utilizzo della tua app che possono uscire dall'app premendo il tasto di accensione.

Chiusura con il tasto di accensione

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

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

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

Tieni presente che quando viene premuto il pulsante di accensione, il metodo isFinishing() della classe Activity non restituisce true e non puoi intercettare l'evento chiave.

Per maggiori informazioni, vedi Navigazione.