Android ViewBinding 与 CustomView
Android ViewBinding with 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 synthetic ??
提前致谢。
我相信您可以在自定义视图中使用 setter。由于 ViewBinding 为您的主布局生成绑定 class,它应该 return 您的 CustomView class。因此,您可以使用刚刚编写的 setter 来更改文本。
ViewDataBinding.inflate
不会在自定义视图中生成子视图访问器。
因此,您不能通过仅使用 ViewDataBinding
.
来触摸 line1(TextView)
如果您不想使用findViewById
或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"
}
}
另一种方法是return CustomView
绑定object
。
class CustomView constructor(context: Context, attrs: AttributeSet?) :
ConstraintLayout(context, attrs){
private val _binding: CustomViewBinding = CustomViewBinding.inflate(
LayoutInflater.from(context), this, true)
val binding get() = _binding
}
然后在您的 Activity
或 Fragment
中:
binding.customView.binding.line1?.text = "Hello"
binding.customView.binding.line2?.text = "World"
我想试用带有自定义视图的 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 synthetic ??
提前致谢。
我相信您可以在自定义视图中使用 setter。由于 ViewBinding 为您的主布局生成绑定 class,它应该 return 您的 CustomView class。因此,您可以使用刚刚编写的 setter 来更改文本。
ViewDataBinding.inflate
不会在自定义视图中生成子视图访问器。
因此,您不能通过仅使用 ViewDataBinding
.
如果您不想使用findViewById
或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"
}
}
另一种方法是return CustomView
绑定object
。
class CustomView constructor(context: Context, attrs: AttributeSet?) :
ConstraintLayout(context, attrs){
private val _binding: CustomViewBinding = CustomViewBinding.inflate(
LayoutInflater.from(context), this, true)
val binding get() = _binding
}
然后在您的 Activity
或 Fragment
中:
binding.customView.binding.line1?.text = "Hello"
binding.customView.binding.line2?.text = "World"