单Activity模式下用add()添加半屏Fragment后如何禁止背景Fragment交互
半屏Fragment阻断下层交互实现方案
以下为无需使用DialogFragment的可行实现方案,适配单Activity架构下通过supportFragmentManager.add()添加Fragment的场景:
方案1:上层Fragment根布局消费触摸事件(优先推荐,侵入性最低)
- 调整上层Fragment的根布局参数:宽高都设为
match_parent,仅内部实际展示的内容区域控制为半屏高度,根布局其余区域保持透明即可。 - 给根布局添加属性
android:clickable="true"、android:focusable="true",即可自动消费所有落到根布局范围内的触摸事件,不会向下分发到下层Fragment。 - 若需要更稳妥的拦截,可直接给根布局设置触摸监听,示例代码如下:
// Kotlin 实现 rootView.setOnTouchListener { _, _ -> // 直接返回true消费所有触摸事件 true }
// Java 实现 rootView.setOnTouchListener((v, event) -> { // 直接返回true消费所有触摸事件 return true; });
方案2:主动控制下层Fragment交互状态
- 调用
supportFragmentManager.add()添加上层半屏Fragment前,获取当前栈顶的下层可见Fragment实例,通过setMaxLifecycle()限制其生命周期到STARTED状态,同时手动禁用下层所有可交互控件的点击、触摸能力。 - 上层Fragment销毁、回退时,主动恢复下层Fragment的生命周期状态到RESUMED,同时恢复所有控件的交互能力。
方案3:Activity全局触摸拦截
- 在宿主Activity的
dispatchTouchEvent方法中增加判断逻辑:- 先检测当前半屏Fragment是否已经被添加到FragmentManager中
- 若已添加,且触摸事件的坐标不落在上层Fragment的内容交互区域内,直接返回true消费该事件,不向下分发。
- 该方案适合需要统一管控多类半屏Fragment交互的场景。
内容的提问来源于stack exchange,提问作者Dwane13
相关产品推荐
相关产品推荐

