与自定义视图的android数据绑定

Android数据绑定指南讨论了活动或片段中的绑定值,但是有没有一种方法可以与自定义视图执行数据绑定?

我想做一些事情:

<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"> <com.mypath.MyCustomView android:id="@+id/my_view" android:layout_width="match_parent" android:layout_height="40dp"/> </LinearLayout> 

my_custom_view.xml

 <layout> <data> <variable name="myViewModel" type="com.mypath.MyViewModelObject" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{myViewModel.myText}" /> </LinearLayout> </layout> 

尽pipe可以通过在自定义视图上设置自定义属性来实现这一点,但是如果要绑定很多值,这将很快变得麻烦。

有没有一个很好的方法来完成我想要做的事情?

Solutions Collecting From Web of "与自定义视图的android数据绑定"

在您的自定义视图中,通常会膨胀布局,并为要设置的属性提供setter:

 private MyCustomViewBinding mBinding; public MyCustomView(...) { ... LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mBinding = MyCustomViewBinding.inflate(inflater); } public void setMyViewModel(MyViewModelObject obj) { mBinding.setMyViewModel(obj); } 

然后在布局中使用它:

 <layout xmlns...> <data> <variable name="myViewModel" type="com.mypath.MyViewModelObject" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"> <com.mypath.MyCustomView android:id="@+id/my_view" app:myViewModel="@{myViewModel}" android:layout_width="match_parent" android:layout_height="40dp"/> </LinearLayout> </layout> 

在上面,为app:myViewModel创build了一个自动绑定属性,因为有一个名为setMyViewModel的setter。

首先,不要这样做,如果这个自定义视图已经在<include>在另一个布局,如活动等。你只会得到一个exception关于标签是意想不到的价值。 数据绑定已经运行了绑定,所以你就设置好了。

你尝试使用onFinishInflate来运行绑定? (Kotlin例子)

 override fun onFinishInflate() { super.onFinishInflate() this.dataBinding = MyCustomBinding.bind(this) } 

请记住,如果您在视图中使用绑定,则无法以编程方式创build绑定,但即使可以,也至less会支持这两种绑定。

在乔治提出的解决scheme之后 ,android studio中的graphics编辑器不再能够渲染自定义视图。 原因是,下面的代码实际上没有任何意见:

 public MyCustomView(...) { ... LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mBinding = MyCustomViewBinding.inflate(inflater); } 

我想绑定处理通货膨胀,但graphics编辑不喜欢它。

在我的具体用例中,我想绑定一个字段,而不是整个视图模型。 我想出了(kotlin收到):

 class LikeButton @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : ConstraintLayout(context, attrs, defStyleAttr) { val layout: ConstraintLayout = LayoutInflater.from(context).inflate(R.layout.like_button, this, true) as ConstraintLayout var numberOfLikes: Int = 0 set(value) { field = value layout.number_of_likes_tv.text = numberOfLikes.toString() } } 

类似button由图像和文本视图组成。 文本视图保存喜欢的数量,我想通过数据绑定设置。

通过使用numberOfLikes的setter作为下列xml中的一个属性,数据绑定自动进行关联:

 <views.LikeButton android:id="@+id/like_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" app:numberOfLikes="@{story.numberOfLikes}" /> 

详细阅读: https : //medium.com/google-developers/android-data-binding-custom-setters-55a25a7aea47

基于你在做什么,我试图做MyCustomBinding.bind(this) ,不再为我工作。 绑定已经发生,但是我们做的是find它。

 private MyCustomBinding binding; @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); binding = DataBindingUtil.getBinding(this); //got the binding! MyViewModelObject model = MyViewModelObject.get("myText"); binding.setVariable(BR.myViewModel, model); } 
  • 我的看法
  • 我的布局