Выйти из полноэкранного режима на Wear

Попробуйте способ создания
Jetpack Compose для Wear OS — рекомендуемый набор инструментов пользовательского интерфейса для Wear OS.

Пользователь может выйти из действия 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)
            }
}

Ява

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

Ява

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 , и вы не можете перехватить событие клавиши.

Дополнительную информацию см. в разделе «Навигация» .