Выйти из полноэкранного режима на 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)
            }
}

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

Для получения более подробной информации см. раздел «Навигация» .