You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 10:06:22