Vollbildaktivitäten auf Wear beenden

Die Compose-Methode
Jetpack Compose für Wear OS ist das empfohlene UI-Toolkit für Wear OS.

Nutzer können eine Wear OS-Aktivität beenden, indem sie von links nach rechts wischen. Wenn die App horizontales Scrollen unterstützt, beenden Nutzer sie, indem sie zum Rand des Inhalts navigieren und dann von links nach rechts wischen. Durch Drücken der Ein/Aus-Taste kehren Nutzer auch zum Zifferblatt zurück.

Die Wischgeste zum Schließen

Nutzer wischen von links nach rechts, um den aktuellen Bildschirm zu schließen. Wir empfehlen daher, Folgendes zu verwenden:

  • Vertikale Layouts
  • Content-Container

Außerdem empfehlen wir, dass Ihre App keine horizontalen Wischgesten enthält.

Aktivität schließen

Aktivitäten unterstützen automatisch die Wischgeste zum Schließen. Wenn Nutzer eine Aktivität von links nach rechts wischen, wird sie geschlossen und die App navigiert im Back-Stack nach unten.

Fragment schließen

Wenn Sie die Wischgeste zum Schließen in Fragmenten unterstützen möchten, müssen Sie die Ansicht, die das Fragment enthält, in die SwipeDismissFrameLayout Klasse einfügen. Berücksichtigen Sie dies bei der Entscheidung, ob Sie Fragmente verwenden möchten. Verwenden Sie die SwipeDismissFrameLayout Klasse wie im folgenden Beispiel gezeigt:

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;
    }
}

Hinweis: Wenn Sie Fragmente in Ihrer Aktivität verwenden, verwenden Sie FragmentManager.add anstelle von FragmentManager.replace , um die Wischgeste zum Schließen zu unterstützen. So wird dafür gesorgt, dass Ihr vorheriges Fragment unter dem oberen Fragment gerendert wird, während es weggewischt wird.

Horizontal scrollbare Ansichten

In einigen Fällen, z. B. in einer Ansicht mit einer Karte, die das Schwenken unterstützt, kann die Benutzeroberfläche horizontales Wischen nicht verhindern. In diesem Fall haben Sie zwei Möglichkeiten:

  • Wenn der Back-Stack kurz ist, können Nutzer die App schließen und zum Startbildschirm des Zifferblatts zurückkehren indem sie die Ein/Aus-Taste drücken.
  • Wenn Nutzer im Back-Stack nach unten navigieren sollen, können Sie die Ansicht in ein SwipeDismissFrameLayout Objekt einfügen, das das Wischen vom Rand unterstützt. Das Wischen vom Rand wird aktiviert, wenn die Ansicht oder ihre untergeordneten Elemente true von einem canScrollHorizontally()-Aufruf zurückgeben. Mit dem Wischen vom Rand können Nutzer die Ansicht schließen, indem sie von den linken 10% des Bildschirms wischen, anstatt von einer beliebigen Stelle in der Ansicht.

In den folgenden Beispielen wird gezeigt, wie Sie eine Ansicht in ein SwipeDismissFrameLayout Objekt einfügen:

<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);
    }
  }
);

Nicht empfohlen: Wischgeste zum Schließen deaktivieren

Wir empfehlen im Allgemeinen nicht, die Wischgeste zum Schließen zu deaktivieren, da Nutzer erwarten, dass sie jeden Bildschirm mit einer Wischgeste schließen können. In einem Ausnahmefall können Sie das Standarddesign in einer Stilressource erweitern und das Attribut android:windowSwipeToDismiss auf false setzen, wie im folgenden Codebeispiel gezeigt:

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

Sie können Nutzer dann bei der ersten Verwendung Ihrer App darüber informieren, dass sie die App durch Drücken der Ein/Aus-Taste beenden können.

Schließen mit der Ein/Aus-Taste

Durch Drücken der physischen Ein/Aus-Taste wird ein Ereignis für die Ein/Aus-Taste gesendet. Daher können Sie die Ein/Aus-Taste nicht als Zurück Taste oder für die allgemeine Navigation verwenden.

Wenn die Ein/Aus-Taste gedrückt wird, kehren Nutzer zum Startbildschirm des Zifferblatts zurück. Hiervon gibt es zwei Ausnahmen:

  • Wenn sich Nutzer in einem Eingabemethoden-Editor (Input Method Editor, IME) befinden, z. B. auf einem Bildschirm zur Handschrifterkennung wird durch Drücken der Taste der IME geschlossen und Nutzer kehren zur App zurück.
  • Wenn sich Nutzer auf dem Zifferblatt befinden, wird durch Drücken der Hardwaretaste der App-Launcher geöffnet.

Hinweis: Wenn die Ein/Aus-Taste gedrückt wird, gibt die isFinishing() Methode der Activity Klasse nicht true zurück und Sie können das Tastenereignis nicht abfangen.

Weitere Informationen finden Sie unter Navigation.