You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:57:01