Zamknij pełny ekran na Wear

Użytkownik może zamknąć aktywność na Wear OS, przesuwając palcem od lewej do prawej. Jeśli aplikacja obsługuje przewijanie w poziomie, użytkownik opuszcza aplikację, przechodząc do krawędzi. i przesuń palcem od lewej do prawej. Naciśnięcie przycisku zasilania powoduje też powrót do tarczy zegarka.

Gest przesuwania, aby go zamknąć

Użytkownicy przesuwają palcem od lewej do prawej, aby zamknąć bieżący ekran. Dlatego zalecamy użycie:

  • Układy pionowe
  • Kontenery treści

Zalecamy też, aby aplikacja nie zawierała gesty przesunięcia w poziomie.

Odrzuć aktywność

Aktywności automatycznie obsługują przesuwanie palcem, aby zamknąć aplikację. Przesuwanie aktywności od lewej do prawej powoduje odrzucenie aktywności, przechodzi w dół po .

Odrzuć fragment

Aby obsługiwać przesuwanie palcem, aby zamknąć go we fragmentach, musisz zawijać elementy lub widoku zawierającym fragmenty SwipeDismissFrameLayout zajęcia. Weź to pod uwagę przy podejmowaniu decyzji, czy użyć fragmentów. Użyj SwipeDismissFrameLayout zgodnie z poniższym przykładem:

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

Uwaga: jeśli w swojej aktywności używasz fragmentów, zastosuj FragmentManager.add. zamiast FragmentManager.replace. aby obsługiwać gest przesuwania, aby go zamknąć. Dzięki temu poprzedni fragment będzie renderowany pod górnym fragmentem, gdy jest ją przesunął.

Widoki z możliwością przewijania w poziomie

W niektórych przypadkach, na przykład w widoku zawierającym mapę obsługującą przesuwanie, interfejs nie może zapobiec przesuwaniu w poziomie. W tym dostępne są dwie opcje:

  • Jeśli tylny stos jest krótki, użytkownik może zamknąć aplikację i wrócić do niej. na ekran główny tarczy zegarka, naciskając przycisk zasilania.
  • Jeśli chcesz, aby użytkownik schodził z tyłu, możesz owinąć widok w obiekcie SwipeDismissFrameLayout, który obsługuje krawędź przesuń palcem. Przesunięcie wzdłuż krawędzi jest włączone, gdy powraca widok lub jego elementy podrzędne true z canScrollHorizontally() połączenie. Przesunięcie wzdłuż krawędzi umożliwia użytkownikowi zamknąć widok, przesuwając palcem od 10% ekranu od lewej krawędzi, zamiast w dowolnym miejscu widoku.

Poniższe przykłady pokazują, jak zawijać widok w SwipeDismissFrameLayout obiekt:

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

Niezalecane: wyłącz funkcję przesuwania, aby ją zamknąć

Zasadniczo nie zalecamy wyłączania tej funkcji, ponieważ oczekuje zamknięcia dowolnego ekranu po przesunięciu palcem. W wyjątkowym przypadku możesz rozszerzyć domyślny motyw w zasób stylu i ustawić atrybut android:windowSwipeToDismiss do false, jak widać w tym przykładowym kodzie:

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

Dzięki temu możesz informować użytkowników o pierwszym skorzystaniu z Twojej aplikacji że mogą wyjść z aplikacji przez naciśnięcie przycisku zasilania.

Zamykanie za pomocą przycisku zasilania

Naciśnięcie fizycznego przycisku zasilania powoduje wysłanie klawisza zasilania . Dlatego nie można używać przycisku zasilania jako tylnej części urządzenia, lub do nawigacji.

Po naciśnięciu przycisku zasilania użytkownik wróci na ekran główny tarczy zegarka. Istnieją dwa wyjątki:

  • Jeśli użytkownik używa edytora metody wprowadzania (IME), takiego jak pismo odręczne ekran rozpoznawania, naciśnij przycisk zamyka edytor IME i powraca użytkownika do aplikacji.
  • Jeśli użytkownik znajduje się przy tarczy zegarka, naciskając przycisk sprzętowy otwiera program uruchamiający aplikacje.

Pamiętaj, że po naciśnięciu przycisku zasilania Metoda isFinishing() klasy Activity robi nie zwraca wartości true i nie można przechwycić kluczowego zdarzenia.

Więcej informacji: Nawigacja