Fragment中VideoView与搭载条形码扫描器的Fragment重叠问题求助
Fragment使用VideoView与其他Fragment重叠故障解决方案
故障根因
- VideoView继承自
SurfaceView,其渲染层独立于应用普通View的绘制层级,不会跟随所属Fragment的视图状态同步显隐:即使所属Fragment被隐藏/替换,SurfaceView的渲染层仍会停留在屏幕上,最终和条码扫描器的Fragment发生重叠 - ImageView属于普通View子类,完全跟随所属Fragment的视图生命周期变化,因此替换后不会出现重叠问题
可实施方案
方案1:替换为TextureView(优先推荐)
TextureView的渲染逻辑和普通View完全一致,会跟随所属Fragment的显隐状态同步变化,无需额外适配生命周期。仅需两步即可完成修改:
- 将布局文件中
VideoView标签替换为TextureView - 代码中把VideoView类型的变量改为TextureView,原有播放逻辑无需调整
方案2:补充VideoView生命周期控制逻辑
在搭载VideoView的Fragment中新增如下生命周期回调代码,手动控制播放状态和显隐:
@Override public void onPause() { super.onPause(); if (vd != null && vd.isPlaying()) { vd.pause(); } vd.setVisibility(View.GONE); } @Override public void onResume() { super.onResume(); if (vd != null) { vd.setVisibility(View.VISIBLE); vd.start(); } } @Override public void onDestroyView() { super.onDestroyView(); if (vd != null) { vd.stopPlayback(); vd = null; } }
方案3:临时修复(非长期方案)
如果不需要Fragment背景透明,给fragment_splash_screen布局的根节点设置不透明的纯色背景,即可覆盖残留的SurfaceView渲染层,快速解决重叠问题。
内容的提问来源于stack exchange,提问作者JASIM CHOUHAN
相关产品推荐
相关产品推荐

