如何实现DrawerLayout侧边栏类似三星多窗口侧边栏的全局唤起功能
安卓全局可唤起侧边栏实现方案
你当前使用的DrawerLayout是仅能在应用内部Activity页面生效的组件,天然不支持跨应用、桌面场景唤起,要实现类似三星多窗口侧边栏的全局唤起效果,需要基于系统悬浮窗能力改造,具体步骤如下:
1 申请所需权限
首先在AndroidManifest.xml中添加权限声明:
<!-- 悬浮窗显示权限 --> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 引导用户开启悬浮窗权限的必要声明 --> <uses-permission android:name="android.permission.ACTION_MANAGE_OVERLAY_PERMISSION" />
Android 6.0及以上系统需要动态申请权限,运行时先判断有没有悬浮窗权限,没有的话引导用户去系统设置开启:
// 权限判断示例 if (!Settings.canDrawOverlays(this)) { val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:$packageName")) startActivityForResult(intent, 1001) }
2 实现全局悬浮侧边栏
你原有DrawerLayout里的NavigationView及内部布局可以直接复用,不用大改:
- 启动一个前台服务来管理悬浮侧边栏的生命周期,避免被系统后台回收
- 用WindowManager在屏幕边缘添加一个细的透明触发条,监听用户的滑动手势
- 当用户滑动触发条达到阈值时,通过WindowManager把你复用的侧边栏布局渲染到屏幕上,效果和你现有应用内的DrawerLayout完全一致
3 交互逻辑适配
- 保留原有DrawerLayout的滑动收起、点击外部收起的逻辑,都可以通过监听悬浮窗的触摸事件实现
- 侧边栏的列表点击事件可以直接复用你现有应用内的逻辑,不需要重复开发
可选优化
如果你想保留应用内原有DrawerLayout的使用,可以把侧边栏的内容渲染、事件处理都封装成公共模块,应用内DrawerLayout和全局悬浮侧边栏共用同一套逻辑,减少维护成本。
内容的提问来源于stack exchange,提问作者Zobaer Hossain
相关产品推荐
相关产品推荐

