android - Android ViewBinding 与 CustomView
问题描述
我想用自定义视图试用 ViewBinding,例如:
MainActivity <=> layout_main.xml
MyCustomView <=> layout_my_custom_view.xml
layout_main.xml
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.myapplication.MyCustomView
android:id="@+id/custom_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
layout_my_custom_view.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/line1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Line1" />
<View
android:id="@+id/divider"
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="#2389bb" />
<TextView
android:id="@+id/line2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Line2" />
</LinearLayout>
主要活动
class MainActivity : AppCompatActivity() {
private lateinit var binding: LayoutMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = LayoutMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.customView.line1.text = "Hello"
binding.customView.line2.text = "World"
}
}
在我的 MainActivity 中,我可以使用绑定来查找 MyCustomView,但我无法在 MyCustomView 中进一步找到@id/line1
和@id/line2
。在这种情况下,是否可以仅使用 ViewBinding 还是必须使用findViewById
Kotlin 合成?
提前致谢。
解决方案
ViewDataBinding.inflate
不会在自定义视图中生成子视图访问器。
因此,您不能仅通过使用来触摸line1(TextView)ViewDataBinding
。
如果不想使用findViewById
or kotlin synthetic
,MyCustomView
也需要申请ViewDataBinding
。尝试如下。
自定义视图
class MyCustomView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr) {
private val binding =
CustomLayoutBinding.inflate(LayoutInflater.from(context), this, true)
val line1
get() = binding.line1
val line2
get() = binding.line2
}
主要活动
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(LayoutInflater.from(this))
setContentView(binding.root)
with(binding.customView) {
line1.text = "Hello"
line2.text = "World"
}
}
推荐阅读
- web-services - 在 spring-boot 中使用 SOAP 服务
- python - 在熊猫中按字符串列编号的名称聚合列值
- amazon-s3 - 如何在 S3 中读取经过训练的数据文件
- python-3.x - 是否可以以异步/等待方式将任务发送到 pyRQ redis 队列?
- node.js - 如何在守护程序节点中获取有效负载?
- c - 如何确保生产者和消费者线程一个接一个地无限运行?
- java - java.sql.SQLSyntaxErrorException:用户缺少特权或在 ubuntu 中找不到对象
- c# - SMO 创建的存储过程中的短路
- sapui5 - SAP UIveri5 最小示例
- angular - 在 Angular 中导入“dexie-export-import”时出错