用户可通过从左向右滑动来退出 Wear OS activity。如果应用支持水平滚动,那么用户可通过导航到内容边缘,然后从左向右滑动来退出。按电源按钮也会让用户返回到表盘。
滑动关闭手势
用户从左向右滑动即可关闭当前屏幕。因此,我们建议您采用以下项:
- 垂直布局
- 内容容器
此外,我们也建议您不要在应用中添加水平滑动手势。
关闭 activity
activity 自动支持滑动关闭。从左向右滑动某个 activity 可使该 activity 关闭,并且应用会沿着返回堆栈逐层返回。
关闭 fragment
若要在 fragment 中支持滑动关闭,您必须在 SwipeDismissFrameLayout
类中封装一个包含 fragment 的视图。在决定是否使用 fragment 时,请考虑到这一点。有关 SwipeDismissFrameLayout
类的具体用法,请参考下面的示例:
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; } }
注意:在 activity 中使用 fragment 时,请使用 FragmentManager.add
(而非 FragmentManager.replace
)来支持滑动关闭手势。这有助于确保前一个 fragment 被滑动关闭时会在顶部 fragment 下方呈现。
水平可滚动视图
在某些情况下(例如,视图包含支持平移的地图),界面无法阻止水平滑动。在这种情况下,有两种选择:
- 如果返回堆栈较短,用户可通过按电源按钮来关闭应用并返回表盘主屏幕。
- 如果您希望用户沿着返回堆栈逐层返回,可以将视图封装在一个支持边缘滑动的
SwipeDismissFrameLayout
对象中。如果视图或其子项从canScrollHorizontally()
调用返回true
,就表示边缘滑动处于启用状态。借助边缘滑动,用户不仅可在视图中的任意位置滑动来关闭视图,而且还能从屏幕最左侧 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>
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); } } );
不推荐:停用滑动关闭
我们通常不建议停用滑动关闭,因为通过滑动来关闭屏幕符合用户的预期。但在特殊情况下,您可以在样式资源中扩展默认主题,并将 android:windowSwipeToDismiss
属性设为 false
,如以下代码示例所示:
<resources> <style name="AppTheme" parent="@android:style/Theme.DeviceDefault"> <item name="android:windowSwipeToDismiss">false</item> </style> </resources>
然后,您可以在用户首次使用您的应用时通知对方,按电源按钮即可退出应用。
使用电源按钮关闭
按实体电源按钮会发送电源键事件。因此,您不能将电源按钮用作返回按钮或一般的导航按钮。
按电源按钮会让用户返回到表盘主屏幕。不过,有以下两种例外情况:
- 如果用户正在使用输入法(例如,手写识别屏幕),则按该按钮会关闭输入法并让用户返回应用。
- 如果用户正在表盘上,按该硬件按钮会打开应用启动器。
请注意,按电源按钮时,Activity
类的
isFinishing()
方法不会返回 true
,并且您无法截获按键事件。
如需了解详情,请参阅导航。