Android Fragment下使用ViewBinding绑定ExoPlayer自定义控制布局控件问题
问题原因
你出现布局叠加的核心原因是同时存在两份custom_player布局实例:
- 第一份是你手动调用
CustomPlayerBinding.inflate(inflater, binding!!.root, true)inflate后直接添加到了Fragment根布局中 - 第二份是PlayerView根据你配置的
app:controller_layout_id="@layout/custom_player"属性,自动加载的控制栏布局
两份完全一样的布局叠加,你只给手动加载的那一份设置了点击事件,自然会出现一个可点击、一个无响应的问题。
解决方案
不要手动inflate自定义控制布局,而是通过ViewBinding的bind()方法绑定PlayerView已经自动加载好的控制栏视图即可,修改代码如下:
第一步:删除多余的inflate逻辑
移除onCreateView中customPlayer = CustomPlayerBinding.inflate(inflater, binding!!.root, true)这行代码,同时可以去掉全局的customPlayer变量声明,改为局部持有即可。
第二步:绑定PlayerView已加载的控制栏视图
修改onViewCreated中的逻辑,在设置完Player后绑定控制栏:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val simpleExoPlayer = SimpleExoPlayer.Builder(requireContext()).build() binding?.playerVIew?.player = simpleExoPlayer val mediaItem = MediaItem.fromUri(video.toString()) simpleExoPlayer.addMediaItem(mediaItem) simpleExoPlayer.prepare() simpleExoPlayer.playWhenReady = true // 绑定PlayerView自动加载的控制栏布局,无需手动inflate binding?.playerVIew?.controllerView?.let { controllerView -> val customPlayerBinding = CustomPlayerBinding.bind(controllerView) customPlayerBinding.optionBtn.setOnClickListener { // 你的点击逻辑 } } }
兼容旧版本ExoPlayer方案
如果你的ExoPlayer版本较低无法直接访问controllerView属性,也可以直接通过PlayerView查找对应控件:
binding?.playerVIew?.findViewById<Button>(R.id.optionBtn)?.setOnClickListener { // 点击逻辑 }
内容的提问来源于stack exchange,提问作者Riccoh
相关产品推荐
相关产品推荐

