Wear OS 3禁用顶部上滑唤起系统快捷设置面板,改用导航抽屉
解决Wear OS 3中禁止顶部上滑唤起系统快捷设置面板的问题
问题背景
在Wear OS 3设备的自定义应用内,顶部上滑手势会触发系统快捷设置面板,但Wear OS 2及更早版本中不会出现此行为。当前应用通过WearableNavigationDrawerView监听顶部上滑手势来展示「登出」选项,需要让应用手势优先于系统手势,禁用系统对该手势的响应。
当前实现代码
初始化NavigationDrawer逻辑
private void initNavigationDrawer() { List<NavigationItem> navigationItems = new ArrayList<>(); navigationItems.add(new NavigationItem(getString(R.string.logout_button), getDrawable(R.drawable.ic_bsh_play_icon))); binding.navigationDrawer.setAdapter(new NavigationAdapter(navigationItems)); binding.navigationDrawer.getController().peekDrawer(); binding.navigationDrawer.addOnItemSelectedListener(pos -> { if (navigationItems.get(pos).getItemTitle().equals(getString(R.string.logout_button))) { mainViewModel.logout(); } }); }
NavigationAdapter实现
public class NavigationAdapter extends WearableNavigationDrawerView.WearableNavigationDrawerAdapter { private final List<NavigationItem> items; NavigationAdapter(List<NavigationItem> items) { this.items = items; } @Override public CharSequence getItemText(int pos) { return items.get(pos).getItemTitle(); } @Override public Drawable getItemDrawable(int pos) { return items.get(pos).getItemIcon(); } @Override public int getCount() { return items.size(); } }
解决方案
1. 重写EdgeSwipeCallback拦截顶部手势
Wear OS提供了EdgeSwipeCallback用于处理边缘滑动手势,通过重写该回调可以拦截顶部上滑并优先触发应用逻辑:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 初始化视图等原有代码... setEdgeSwipeCallback(new EdgeSwipeCallback() { @Override public void onSwipe(int edgeFlags) { if (edgeFlags == EDGE_TOP) { // 触发应用内NavigationDrawer的展示逻辑 binding.navigationDrawer.getController().peekDrawer(); } else { // 其他边缘手势交给系统处理 super.onSwipe(edgeFlags); } } }); }
2. 调整窗口属性阻止系统响应
通过设置窗口标志和系统窗口内边距监听,消费顶部区域的触摸事件,避免系统唤起快捷面板:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { getWindow().setDecorFitsSystemWindows(false); View decorView = getWindow().getDecorView(); decorView.setOnApplyWindowInsetsListener((v, insets) -> { // 消费系统窗口内边距,阻止系统处理顶部区域手势 return insets.consumeSystemWindowInsets(); }); } // 原有初始化代码... }
3. 确保NavigationDrawer的触摸优先级
在布局文件中给WearableNavigationDrawerView设置可点击和可聚焦属性,提升其触摸事件优先级:
<androidx.wear.widget.WearableNavigationDrawerView android:id="@+id/navigationDrawer" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" android:focusable="true" />
同时确保在代码中调用peekDrawer()让Drawer处于可监听手势的状态,保证应用手势能被优先捕获。
内容的提问来源于stack exchange,提问作者Red Coder
相关产品推荐
相关产品推荐

