Пользователь может выйти из приложения Wear OS, проведя пальцем слева направо. Если приложение поддерживает горизонтальную прокрутку, пользователь выходит, перейдя к краю контента и проведя пальцем слева направо. Нажатие кнопки питания также возвращает пользователя к циферблату часов.
Жест "провести пальцем для закрытия"
Пользователи проводят пальцем слева направо, чтобы закрыть текущий экран. Поэтому мы рекомендуем использовать следующий способ:
- Вертикальные макеты
- Контейнеры содержимого
Мы также рекомендуем, чтобы ваше приложение не содержало жестов горизонтального свайпа.
Отклонить задание
Активности автоматически поддерживают закрытие с помощью свайпа. Свайп слева направо приводит к закрытию активности, и приложение переходит к следующему элементу в списке .
Отклонить фрагмент
Для поддержки закрытия фрагментов с помощью свайпа необходимо обернуть содержащий фрагмент элемент в класс SwipeDismissFrameLayout . Учитывайте это при принятии решения об использовании фрагментов. Используйте класс SwipeDismissFrameLayout , как показано в следующем примере:
Котлин
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; } }
Примечание: При использовании фрагментов внутри активности используйте FragmentManager.add вместо FragmentManager.replace , чтобы поддерживать жест закрытия с помощью свайпа. Это гарантирует, что предыдущий фрагмент будет отображаться под верхним фрагментом, пока его смахивают.
Горизонтальные прокручиваемые представления
В некоторых случаях, например, в представлении, содержащем карту с поддержкой панорамирования, пользовательский интерфейс не может предотвратить горизонтальное пролистывание. В этом сценарии есть два варианта:
- Если стек возврата короткий, пользователь может закрыть приложение и вернуться на главный экран циферблата, нажав кнопку питания.
- Если вы хотите, чтобы пользователь перешёл по стеку возврата, вы можете обернуть представление в объект
SwipeDismissFrameLayout, который поддерживает свайп от края экрана. Свайп от края экрана включается, когда представление или его дочерние элементы возвращаютtrueиз вызоваcanScrollHorizontally(). Свайп от края экрана позволяет пользователю закрыть представление, проведя пальцем от самых левых 10% экрана, а не из любой точки представления.
Следующие примеры показывают, как обернуть представление в объект 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>
Котлин
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); } } );
Не рекомендуется: Отключить функцию закрытия с помощью свайпа.
Обычно мы не рекомендуем отключать закрытие экрана с помощью свайпа, поскольку пользователь ожидает закрыть любой экран свайпом. В исключительных случаях вы можете расширить тему по умолчанию в ресурсе стиля и установить атрибут android:windowSwipeToDismiss в значение false , как показано в следующем примере кода:
<resources> <style name="AppTheme" parent="@android:style/Theme.DeviceDefault"> <item name="android:windowSwipeToDismiss">false</item> </style> </resources>
Затем вы можете сообщить пользователям при первом использовании вашего приложения, что они могут выйти из него, нажав кнопку питания.
Отключение с помощью кнопки питания
Нажатие физической кнопки питания отправляет событие активации кнопки питания. Поэтому вы не можете использовать кнопку питания в качестве кнопки «Назад» или для навигации в целом.
При нажатии кнопка питания возвращает пользователя на главный экран циферблата. Есть два исключения:
- Если пользователь находится в редакторе методов ввода (IME), например, на экране распознавания рукописного ввода, нажатие кнопки закрывает IME и возвращает пользователя в приложение.
- Если пользователь находится на циферблате часов, нажатие аппаратной кнопки открывает панель запуска приложений.
Обратите внимание , что при нажатии кнопки питания метод isFinishing() класса Activity не возвращает true , и вы не можете перехватить событие нажатия клавиши.
Для получения более подробной информации см. раздел «Навигация» .
