Użytkownik może zamknąć aktywność na Wear OS, przesuwając palcem od lewej do prawej. Jeśli aplikacja ma przewijanie poziome, użytkownik może ją zamknąć, przechodząc do krawędzi treści i przesuwając palcem od lewej do prawej. Naciśnięcie przycisku zasilania powoduje również powrót do tarczy zegarka.
Gest przesunięcia, aby zamknąć
Użytkownicy przesuwają palcem z lewej do prawej, aby zamknąć bieżący ekran. Dlatego zalecamy użycie tych opcji:
- Układy pionowe
- Kontenery treści
Zalecamy też, aby aplikacja nie zawierała gestów przesuwania w poziomie.
Zamknij aktywność
Aktywności automatycznie obsługują gest przesunięcia w stronę, aby zamknąć. Przesunięcie aktywności z lewej do prawej powoduje jej zamknięcie, a aplikacja przechodzi do poprzedniego stosu.
Zamknij fragment
Aby umożliwić usuwanie fragmentów przez przesunięcie, musisz umieścić widok zawierający fragmenty w klasie
SwipeDismissFrameLayout. Weź to pod uwagę, decydując, czy używać fragmentów. Użyj klasy SwipeDismissFrameLayout, jak w tym przykładzie:
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: gdy używasz fragmentów w ramach aktywności, użyj FragmentManager.add zamiast FragmentManager.replace, aby umożliwić gest przesunięcia w stronę, aby zamknąć.
Dzięki temu poprzedni fragment będzie renderowany pod górnym fragmentem, gdy ten ostatni zostanie przesunięty.
Widoki przewijane poziomo
W niektórych przypadkach, np. w widoku zawierającym mapę, która obsługuje przesuwanie, interfejs użytkownika nie może uniemożliwić przesuwania poziomego. W tym scenariuszu masz 2 opcje:
- Jeśli stos jest krótki, użytkownik może zamknąć aplikację i wrócić do ekranu głównego tarczy zegarka, naciskając przycisk zasilania.
- Jeśli chcesz, aby użytkownik przeszedł do poprzedniego elementu w steku, możesz opakować widok w obiekcie
SwipeDismissFrameLayout, który obsługuje przesuwanie palcem po krawędzi ekranu. Przesuwanie krawędzi jest włączone, gdy widok lub jego elementy podrzędne zwracajątruez poziomucanScrollHorizontally()wywołania. Przesunięcie palcem po krawędzi ekranu pozwala użytkownikowi zamknąć widok przez przesunięcie palcem po lewej krawędzi ekranu (nie w dowolnym miejscu widoku).
Z tych przykładów dowiesz się, jak opakować widok w obiekcie 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); } } );
Niezalecane: wyłączenie funkcji przesuwania w celu zamknięcia
Nie zalecamy wyłączania funkcji usuwania przez przesunięcie, ponieważ użytkownik spodziewa się, że może usunąć dowolny ekran przez przesunięcie. W wyjątkowych przypadkach możesz rozszerzyć domyślny motyw w
zasobie stylów
i ustawić atrybut android:windowSwipeToDismiss
na false, jak pokazano w tym przykładzie kodu:
<resources> <style name="AppTheme" parent="@android:style/Theme.DeviceDefault"> <item name="android:windowSwipeToDismiss">false</item> </style> </resources>
Możesz wtedy poinformować użytkowników, że mogą zamknąć aplikację, naciskając przycisk zasilania.
Zamknij przyciskiem zasilania
Naciśnięcie fizycznego przycisku zasilania powoduje wysłanie zdarzenia power_key. Nie można więc używać przycisku zasilania jako przycisku Wstecz ani do nawigacji.
Po naciśnięciu przycisku zasilania użytkownik wraca do ekranu głównego tarczy zegarka. Istnieją dwa wyjątki:
- Jeśli użytkownik korzysta z edytora metody wprowadzania (IME), np. ekranu rozpoznawania pisma odręcznego, naciśnięcie przycisku spowoduje zamknięcie IME i powrót do aplikacji.
- Jeśli użytkownik jest na tarczy zegarka, naciśnięcie przycisku sprzętowego powoduje otwarcie menu z aplikacjami.
Uwaga: gdy naciśniesz przycisk zasilania, metoda
isFinishing() klasy Activity nie zwraca wartości true i nie możesz przechwycić kluczowego zdarzenia.
Więcej informacji znajdziesz w artykule Nawigacja.