已继承自定义Activity的Android项目如何实现导航抽屉并适配AppCompatActivity
解决方法
不要直接将MainContentActivity的父类修改为AppCompatActivity,否则会完全丢失DraggableNowPlayingSheetActivity提供的可拖拽播放面板功能,正确逻辑是沿着原有继承链路补全AppCompatActivity的能力:
具体操作
- 核查
DraggableNowPlayingSheetActivity的继承链路
打开该自定义Activity的源码查看父类定义:- 如果它本身已经继承自
AppCompatActivity(或其下游封装基类),那么当前MainContentActivity已经自动获得AppCompatActivity的全部能力,不需要修改继承关系,可直接接入侧边导航功能。 - 如果它是直接继承自原生
android.app.Activity,直接将DraggableNowPlayingSheetActivity的父类替换为AppCompatActivity即可——原有拖拽面板的触摸事件处理、生命周期绑定、视图加载逻辑不需要任何改动,AppCompatActivity完全兼容原生Activity的API,不会影响原有功能。
- 如果它本身已经继承自
- 接入左侧滑出导航菜单
- 将页面根布局替换为
DrawerLayout作为最外层容器:内层第一块放置原有主内容视图,第二块放置左侧导航菜单视图(通常为NavigationView),给菜单视图设置layout_gravity="start",实现从左侧滑出的布局基础。 - 调用
ActionBarDrawerToggle关联DrawerLayout与页面Toolbar,实现导航按钮点击开关菜单、滑动手势触发菜单的基础交互,这部分是AppCompatActivity原生支持的能力,不需要额外封装。
- 将页面根布局替换为
- 处理触摸冲突
原有可拖拽底部播放面板会消耗屏幕下半区的触摸事件,需要在DraggableNowPlayingSheetActivity的触摸事件分发逻辑中增加判断:当触摸点落在屏幕左侧边缘的菜单触发区域时,不要拦截事件,分交给DrawerLayout处理,避免出现侧边栏手势被拖拽面板吃掉、无法触发的问题。
内容的提问来源于stack exchange,提问作者Imraj Hossain
相关产品推荐
相关产品推荐

