gpt4 book ai didi

android - Android 和 Exoplayer 中的 View 绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 23:54:51 33 4
gpt4 key购买 nike

我在我的 fragment 之一中使用 Android Exoplayer。
在 Exoplayer 中,我使用自定义控件布局“@layout/custom_player”作为控件。
我在布局中有不同的元素,例如我有一个按钮元素“optionBtn”,我想从我的 Kotlin 代码连接到 onclicklistener。不幸的是, View 绑定(bind)并不顺利。
这是 XML Exoplayer

  <com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/playerVIew"
app:resize_mode="fill"
android:animateLayoutChanges="true"
app:controller_layout_id="@layout/custom_player"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
这是 Kotlin 代码
...
private var binding: FragmentVideoBinding? = null
private var btnsheetOptions: SheetOptionsBinding? = null
private var sheetDialog: BottomSheetDialog? = null
private var customPlayer: CustomPlayerBinding? = null

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {

btnsheetOptions = SheetOptionsBinding.inflate(inflater, null, false)
sheetDialog = BottomSheetDialog(requireContext(), R.style.BottomSheetDialogTheme)

binding = FragmentVideoBinding.inflate(inflater, container, false)
customPlayer = CustomPlayerBinding.inflate(inflater, binding!!.root, true)

return binding!!.root

}

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


customPlayer!!.optionBtn.setOnClickListener {

...

}

}



override fun onDestroy() {
super.onDestroy()
binding = null
btnsheetOptions = null
sheetDialog= null
customPlayer = null
}

}
...
这样,布局在彼此之上进行了双重膨胀,一个布局与 onclick 监听器一起使用,而另一种则不使用,这不是很有用。
有谁知道正确的解决方案,我几乎整个下午都在研究这个问题。

最佳答案

不能将 View 绑定(bind)与 ExoPlayer 的自定义 HUD 布局一起使用。 View 绑定(bind)仅适用于专门为 Activity/fragment 布局膨胀的布局。自定义 HUD 布局不属于玩家所在的父布局。它以独立的方式充气,不包含在布局中(因此是双充气)。由于自定义布局是膨胀的并且不是原始布局的一部分,因此您不能将 View 绑定(bind)与其中包含的所有 id 一起使用。
那么,如果 View Binding 不能与自定义布局的按钮一起使用怎么办?
您应该使用 findViewById 这是一个属于 Activity 类的函数。
它非常易于使用,我假设您也已经知道如何使用:

    findViewById<ImageButton>(R.id.optionBtn).setOnClickListener {...}
//The next line is for usage inside a fragment class
activity?.findViewById<ImageButton>(R.id.optionBtn).setOnClickListener {...}
确保在布局中为按钮提供 ID,例如:
    android:id="@id/optionBtn"
如果你 不能 找到 (R.id.optionBtn) ?
这是一个常见的问题,有两个 R要注意的目录。
android.R通常用作 R只要。还有应用程序的 R目录。为了区分两者,避免 Unresolved reference问题,您应该以不同的名称导入应用程序的资源,这在 import 中完成在您的类(class)代码开始之前的部分,添加以下内容:
import com.example.app.R as appR
然后你可以尝试使用 appR.id.optionBtn反而。你遇到这个特殊的 R.id 的可能性非常低。问题,但如果发生这种情况,请遵循上述解决方案。
底线 :
1- Viewbinding 仅适用于连接到其上下文类的 Activity/fragment 布局,它将父布局的 id 及其所有 subview 与实际的绑定(bind)变量绑定(bind)。
2- 如果您想直接访问不属于 Activity/fragment 布局的布局,您应该使用 findViewById反而。
3- 如果您在使用“R.id”时遇到问题,您应该以不同的名称导入应用程序的资源。我通常使用“X”而不是“R”。但这都是个人喜好。。

关于android - Android 和 Exoplayer 中的 View 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69698846/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com