查看具有 2 种可能布局的绑定,将绑定变量分配给 2 个生成的绑定 类
View Binding with 2 possible layouts, assign binding variable to 2 generated binding classes
所需功能:
我有一个 Activity,它有一个从后端接收到的值,指示使用两种布局之一。我们将此值称为 layoutType 并假设在下面的示例代码中为简单起见我们不关心如何分配它。因此,我有两个布局 xml 文件,我们称它们为 layout1.xml & layout2.xml.
实施:
我想使用 View Binding。我创建了一个类型为 ViewBinding 的变量,并尝试为其分配 Layout1Binding 或 Layout2Binding.这个逻辑在伪代码中的总结是这样的:
private ViewBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(layoutType == 1){
binding = Layout1Binding.inflate(getLayoutInflater());
} else {
binding = Layout2Binding.inflate(getLayoutInflater());
}
setContentView(binding.getRoot());
}
结果: 当然,这不起作用,变量 binding 似乎没有可以引用的内部子项。另外,当然,如果我将变量的类型转换为 Layout1Binding 并且 layoutType 等于 1,那么我就可以正确使用它。如果我使用 Layout2Binding 并且 layoutType 不等于 1,情况也是如此。所有这些都是有道理的,因为 ViewBinding 只是一个由生成的 类 Layout1Binding & Layout2Binding.
问题: 我如何通过仅使用一个绑定变量来实现上述期望的行为,该变量可以分配给两个不同的生成 类?还有其他替代方法吗?
下面是我如何将适配器用于使用三种布局的自定义视图的示例。 就我而言,不同布局文件中的大多数视图都有共同的 ID。
定义绑定适配器class
class MyCustomViewBindingAdapter(
b1: Layout1Binding?,
b2: Layout2Binding?,
b3: Layout3Binding?
) {
val text =
b1?.myTextView
?: b2?.myTextView
?: b3?.myTextView
val badgeText = b3?.myBadgeTextView
}
创建绑定变量
private lateinit var binding: MyCustomViewBindingAdapter
创建获取绑定适配器的方法
private fun getBinding(layoutType: Int): MyCustomViewBindingAdapter {
val inflater = LayoutInflater.from(context)
return when(layoutType) {
TEXT_ONLY -> {
val textBinding = Layout1Binding.inflate(inflater, this, true)
MyCustomViewBindingAdapter(textBinding, null, null)
}
IMAGE_AND_TEXT -> {
val imageTextBinding = Layout2Binding.inflate(inflater, this, true)
MyCustomViewBindingAdapter(null, imageTextBinding, null)
}
TEXT_AND_BADGE -> {
val textBadgeBinding = Layout3Binding.inflate(inflater, this, true)
MyCustomViewBindingAdapter(null, null, textBadgeBinding)
}
else -> throw IllegalArgumentException("Invalid view type")
}
}
一定要在使用之前初始化绑定
binding = getBinding(layoutType)
所需功能:
我有一个 Activity,它有一个从后端接收到的值,指示使用两种布局之一。我们将此值称为 layoutType 并假设在下面的示例代码中为简单起见我们不关心如何分配它。因此,我有两个布局 xml 文件,我们称它们为 layout1.xml & layout2.xml.
实施: 我想使用 View Binding。我创建了一个类型为 ViewBinding 的变量,并尝试为其分配 Layout1Binding 或 Layout2Binding.这个逻辑在伪代码中的总结是这样的:
private ViewBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(layoutType == 1){
binding = Layout1Binding.inflate(getLayoutInflater());
} else {
binding = Layout2Binding.inflate(getLayoutInflater());
}
setContentView(binding.getRoot());
}
结果: 当然,这不起作用,变量 binding 似乎没有可以引用的内部子项。另外,当然,如果我将变量的类型转换为 Layout1Binding 并且 layoutType 等于 1,那么我就可以正确使用它。如果我使用 Layout2Binding 并且 layoutType 不等于 1,情况也是如此。所有这些都是有道理的,因为 ViewBinding 只是一个由生成的 类 Layout1Binding & Layout2Binding.
问题: 我如何通过仅使用一个绑定变量来实现上述期望的行为,该变量可以分配给两个不同的生成 类?还有其他替代方法吗?
下面是我如何将适配器用于使用三种布局的自定义视图的示例。 就我而言,不同布局文件中的大多数视图都有共同的 ID。
定义绑定适配器class
class MyCustomViewBindingAdapter(
b1: Layout1Binding?,
b2: Layout2Binding?,
b3: Layout3Binding?
) {
val text =
b1?.myTextView
?: b2?.myTextView
?: b3?.myTextView
val badgeText = b3?.myBadgeTextView
}
创建绑定变量
private lateinit var binding: MyCustomViewBindingAdapter
创建获取绑定适配器的方法
private fun getBinding(layoutType: Int): MyCustomViewBindingAdapter {
val inflater = LayoutInflater.from(context)
return when(layoutType) {
TEXT_ONLY -> {
val textBinding = Layout1Binding.inflate(inflater, this, true)
MyCustomViewBindingAdapter(textBinding, null, null)
}
IMAGE_AND_TEXT -> {
val imageTextBinding = Layout2Binding.inflate(inflater, this, true)
MyCustomViewBindingAdapter(null, imageTextBinding, null)
}
TEXT_AND_BADGE -> {
val textBadgeBinding = Layout3Binding.inflate(inflater, this, true)
MyCustomViewBindingAdapter(null, null, textBadgeBinding)
}
else -> throw IllegalArgumentException("Invalid view type")
}
}
一定要在使用之前初始化绑定
binding = getBinding(layoutType)