我正在使用 ViewBinding,并且尝试减少创建 Fragment 的代码,该 Fragment 是一个抽象类并包含以下代码:
abstract class MyFragment<T> : Fragment() {
private var binding: T? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = getBinding()
return binding.root
}
abstract fun getBinding(): T
}
Run Code Online (Sandbox Code Playgroud)
为了使其工作,我需要让 T 扩展一个类,并且该类需要是所有绑定类的父类。
所有生成的绑定类都有一个共同的父类?如果是这样那是什么?
所以如果你得到类似下面的东西
> Configure project :app
Warning: The 'kotlin-android-extensions' Gradle plugin is deprecated.
Run Code Online (Sandbox Code Playgroud)
这可能意味着不再支持/弃用使用 Kotlin 合成进行视图绑定。
因此,下面是答案,您可以清楚地了解如何获取/识别与您的视图相关的 ViewBinding 类。
我很难在BottomSheets上为ViewBinding做一个属性委托。
一般的想法与此类似
对于片段我使用像这样
fun <T : ViewBinding> Fragment.viewBinding(viewBindingFactory: (View) -> T) =
FragmentViewBindingDelegate(this, viewBindingFactory)
Run Code Online (Sandbox Code Playgroud)
在作为 Fragments 的 BottomSheetsDialogFragments 上,它不接受委托。
fun <T : ViewBinding> BottomSheetDialogFragment.viewBinding(viewBindingFactory: (View) -> T) =
FragmentViewBindingDelegate(this, viewBindingFactory)
Run Code Online (Sandbox Code Playgroud)
BottomSheets 的生命周期与常规 Fragments 相同,所以我不希望有任何问题。
任何人都想出了一个解决方案?
由于 Kotlin Synthetics 已被弃用,我们正在迁移到 ViewBinding。
我已经尝试了很多关于 ViewStub、ViewBinding 的谷歌搜索和阅读文档,并且已经为 Fragments 活动实现了 ViewBinding,包括、合并标签,但是我找不到任何使用 ViewBinding 来膨胀 ViewStub 的方法。
<ViewStub
android:id="@+id/viewStubLayout"
tools:layout="@layout/view_demo_layout" />
Run Code Online (Sandbox Code Playgroud)
请忽略宽度和高度属性,它们是作为样式添加的,并已从此代码段中删除。
您能否分享如何使用 ViewBinding 动态地使用另一个 xml 布局来扩展此视图。
即使在 ViewStub.java 文件中,类级别的注释也指出,
执行布局资源膨胀的首选方法如下:
ViewStub 存根 = findViewById(R.id.stub); 查看充气 = stub.inflate();
这是否意味着,我必须继续使用 R.layout.xxx_xx 来膨胀视图存根。我不能使用该特定 xml 文件的绑定对象来扩展视图吗?
android kotlin kotlin-android-extensions android-databinding android-viewbinding
我在自定义对话框布局中实现视图绑定时遇到问题。是否可以?
private fun showCustomDialog(title: String) {
val dialog = Dialog(activity)
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
dialog.setCancelable(false)
dialog.setContentView(R.layout.custom_layout)
val body = dialog.findViewById(R.id.body) as TextView
body.text = title
val noBtn = dialog.findViewById(R.id.noBtn) as TextView
yesBtn.setOnClickListener {
dialog.dismiss()
}
val yesBtn = dialog.findViewById(R.id.yesBtn) as Button
noBtn.setOnClickListener { dialog.dismiss() }
dialog.show()
}
Run Code Online (Sandbox Code Playgroud) 我正在 Android 上使用 Kotlin,有一件事让我感到困惑。
当我将一些FragmentsJava 转换为 Kotlin 时,我得到了这个:
class XFragment : Fragment() {
private var binding: FragmentXBinding? = null
override fun onCreateView(inflater: LayoutInflater,
container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = FragmentUhfReadBinding.inflate(inflater, container, false)
return binding!!.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding!!.slPower.addOnChangeListener(this)
binding!!.btnClearTagList.setOnClickListener(this)
}
// ...
private fun updateUi(){
binding!!.someTextView.text = getSomeTextViewText()
binding!!.someSlider.value = getSomeSliderValue()
}
}
Run Code Online (Sandbox Code Playgroud)
我无法使其binding不可为空,因为它必须XFragment在类构造函数之后(onCreateView()或之后)进行初始化。
因此,通过这种方法,它必须可以为空,并且我必须将其放在!!任何地方。
有什么方法可以避免这些!!吗?