Vollbildaktivitäten auf Wear beenden

Compose ausprobieren
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 horizontal scrollt, wechselt der Nutzer zum Ende des Inhalts und wischt dann von links nach rechts, um sie zu schließen. Durch Drücken der Ein-/Aus-Taste kehrt der Nutzer ebenfalls zum Zifferblatt zurück.

Wischgeste zum Schließen

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

  • Vertikale Layouts
  • Content-Container

Wir empfehlen außerdem, dass Ihre App keine horizontalen Wischgesten enthält.

Aktivität schließen

Bei Aktivitäten wird automatisch das Wischen zum Schließen unterstützt. Wenn Sie eine Aktivität von links nach rechts wischen, wird sie geschlossen und die App wechselt zum zurückliegenden Stack.

Fragment schließen

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

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 in Ihrer Aktivität Fragmente verwenden, verwenden Sie FragmentManager.add anstelle von FragmentManager.replace, um die Wisch-Geste zum Schließen zu unterstützen. So wird sichergestellt, dass das vorherige 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 das horizontale Wischen nicht verhindern. In diesem Szenario haben Sie zwei Möglichkeiten:

  • Wenn der Rückstapel kurz ist, kann der Nutzer die App schließen und durch Drücken der Ein-/Aus-Taste zum Zifferblatt-Startbildschirm zurückkehren.
  • Wenn Sie möchten, dass der Nutzer den Rückstapel durchläuft, können Sie die Ansicht in ein SwipeDismissFrameLayout-Objekt einschließen, das das Wischen am Bildschirmrand unterstützt. Das Wischen am Rand ist aktiviert, wenn die Ansicht oder ihre untergeordneten Elemente true von einem canScrollHorizontally()-Aufruf zurückgeben. Beim Wischen am Rand kann der Nutzer die Ansicht schließen, indem er von den linken 10% des Displays nach rechts wischt, anstatt irgendwo in der Ansicht.

In den folgenden Beispielen wird gezeigt, wie eine Ansicht in ein SwipeDismissFrameLayout-Objekt eingefügt wird:

<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: Wischen zum Schließen deaktivieren

Wir empfehlen im Allgemeinen nicht, das Wischen zum Schließen zu deaktivieren, da Nutzer davon ausgehen, dass sie jeden Bildschirm durch Wischen schließen können. In Ausnahmefällen können Sie das Standarddesign in einer Stilressource erweitern und das Attribut android:windowSwipeToDismiss auf false festlegen, 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 die 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

Wenn Sie die Ein-/Aus-Taste drücken, wird ein Ereignis vom Typ „Power Key“ gesendet. Daher können Sie die Ein‑/Aus-Taste nicht als Schaltfläche „Zurück“ oder für die Navigation im Allgemeinen verwenden.

Wenn die Ein‑/Aus-Taste gedrückt wird, kehrt der Nutzer zum Startbildschirm des Zifferblatts zurück. Bitte beachten Sie die folgenden beiden Ausnahmen:

  • Wenn sich der Nutzer in einem Eingabemethoden-Editor (IME) befindet, z. B. in einem Bildschirm für die Handschrifterkennung, wird der IME durch Drücken der Schaltfläche geschlossen und der Nutzer wird zur App zurückgeleitet.
  • Wenn sich der Nutzer auf dem Zifferblatt befindet, wird durch Drücken der Hardwaretaste der App Launcher geöffnet.

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

Weitere Informationen finden Sie unter Navigation.