Android Viewbinding With Customview
Solution 1:
ViewDataBinding.inflate
doesn't generate of child view accessor inside custom view.
thus, you can't touch line1(TextView) via only use ViewDataBinding
.
If you don't want using findViewById
or kotlin synthetic
, MyCustomView
also needs to apply ViewDataBinding
. try as below.
CustomView
classMyCustomView@JvmOverloadsconstructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr) {
privateval binding =
CustomLayoutBinding.inflate(LayoutInflater.from(context), this, true)
val line1
get() = binding.line1
val line2
get() = binding.line2
}
MainActivity
overridefunonCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(LayoutInflater.from(this))
setContentView(binding.root)
with(binding.customView) {
line1.text = "Hello"
line2.text = "World"
}
}
Solution 2:
Another approach is to return the CustomView
binding object
.
classCustomViewconstructor(context: Context, attrs: AttributeSet?) :
ConstraintLayout(context, attrs){
privateval _binding: CustomViewBinding = CustomViewBinding.inflate(
LayoutInflater.from(context), this, true)
val binding get() = _binding
}
And then in your Activity
or Fragment
:
binding.customView.binding.line1?.text = "Hello"
binding.customView.binding.line2?.text = "World"
Solution 3:
Is it possible for you to share your MainActivity class?
How are you trying to reference views?
Ideally it should be possible for you to reference/access the views using either findViewById
or Kotlin synthetic
.
Solution 4:
I believe you can have setter in your custom view. Since ViewBinding generates binding class for your main layout, it should return you the CustomView class. Thus, you can use the setter you just wrote for changing the texts.
Post a Comment for "Android Viewbinding With Customview"