Esci dalle attività a schermo intero su Wear

Un utente può uscire da un'attività di Wear OS scorrendo da sinistra a destra. Se l'app consente lo scorrimento orizzontale, l'utente esce navigando verso il bordo dei contenuti e scorrendo da sinistra a destra. Anche la pressione del tasto di accensione riporta l'utente al quadrante.

Il gesto di scorrimento per ignorare

Gli utenti fanno scorrere il dito 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 fare in modo che l'app non contenga gesti di scorrimento in orizzontale.

Ignorare un'attività

Le attività supportano automaticamente lo scorrimento per ignorare. Scorrimento di un'attività da sinistra a destra comporta la chiusura dell'attività e l'app fa scorrere verso il basso back stack.

Ignora un frammento

Per supportare la funzionalità di scorrimento per ignorare in frammenti, devi racchiudere la classe vista contenente frammenti SwipeDismissFrameLayout. Aspetti da considerare al momento di decidere 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ò contribuisce a garantire che il frammento precedente venga visualizzato sotto il frammento superiore mentre si trova sono andate via.

Visualizzazioni scorrevoli orizzontali

In alcuni casi, ad esempio in una visualizzazione contenente una mappa che supporta la panoramica, l'interfaccia utente non è in grado di impedire lo scorrimento orizzontale. In questo puoi scegliere tra 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 scenda in secondo piano, puoi eseguire il wrapping della vista in un oggetto SwipeDismissFrameLayout, che supporta il perimetro scorri. Lo scorrimento dai bordi viene attivato quando tornano la visualizzazione o le relative immagini secondarie true da un canScrollHorizontally() chiamata. Lo scorrimento dal bordo consente all'utente chiudi la visualizzazione scorrendo dal 10% all'estrema sinistra dello schermo, anziché in qualsiasi punto della vista.

I seguenti esempi mostrano come aggregare una vista in una 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: disattiva lo scorrimento per ignorare

In genere sconsigliamo di disattivare lo scorrimento per ignorare, perché l'utente prevede di chiudere qualsiasi schermata con un gesto. In un caso eccezionale, puoi estendere il tema predefinito in un risorsa di stile e imposta l'attributo android:windowSwipeToDismiss a 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>

Dopodiché puoi informare gli utenti quando utilizzano la tua app per la prima volta di poter uscire dall'app premendo il tasto di accensione.

Ignora con il tasto di accensione

Una pressione del tasto di accensione fisico invia un tasto di accensione . Pertanto, non puoi utilizzare il tasto di accensione come retro 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 editor del metodo di input (Input Method Editor, IME), ad esempio una scrittura a mano libera schermata di riconoscimento, premendo il pulsante chiude l'IME e restituisce l'utente all'app.
  • Se l'utente è vicino al quadrante, quando preme il pulsante hardware consente di aprire Avvio applicazioni.

Tieni presente che quando premi il tasto di accensione, la isFinishing() della classe Activity non non restituisce true e non puoi intercettare l'evento chiave.

Per ulteriori informazioni, vedi Navigazione.