具有数据绑定的自定义视图 -> 找不到 setter
Custom View with data binding -> Cannot find setter
我需要为所有屏幕上的工具栏自定义布局,因此我创建了一个扩展 AppBarLayout 的自定义视图 class。它的 xml 包含带有工具栏和 TextView 的 LinearLayout。然后我创建了一个自定义属性来设置 xml 中工具栏的标题。看起来像这样
class MyAppBarLayoutCustomView (...) : AppBarLayout(...) {
init {
val typedArray = context.obtainStyledAttribute(attrs, R.stylable.myAppBarLayoutCustomView, defStyle, 0)
binding.myToolBar.title = typedArray.getString(R.stylable.myAppBarLayoutCustomView_customToolbarTitle) ?: ""
typedArray.recylce()
}
}
如果我只是通过片段中的 xml 设置标题或像这样 activity
就可以正常工作
<MyAppBarLayoutCustomView
android:id="@+id/my_app_bar_layout_view"
andorid:layout_width="match_parent"
andorid:layout_height="wrap_content"
app:customToolbarTitle="@string/mainscreen_title"/>
我想要的和不的工作是通过这样的绑定设置标题
<data>
<variable
name="viewModel"
type="com.my.cool.app.MainScreenViewModel/>
</data>
<LinearLayout ...>
<MyAppBarLayoutCustomView
android:id="@+id/my_app_bar_layout_view"
andorid:layout_width="match_parent"
andorid:layout_height="wrap_content"
app:customToolbarTitle="@{viewModel.title}"/>
</LinearLayout>
</layout>
viewModel 中的绑定如下所示
private val _title = NonNullMutableLiveData(R.string.default_title)
val title: NonNullLiveData<Int> = _title
...
_title.postValue(R.string.custom_title)
我得到的错误如下
Cannot find a setter for <MyAppBarLayoutCustomView app:customToolbarTitle> that accepts parameter type 'com...livedata.NonNullLiveData<java.lang.Integer>
If a binding adapter provides the setter, check that the adapter is annotated correctly and that the parameter type matches.
您必须在自定义视图中使用 BindingAdapter class
@BindingAdapter("app:customToolbarTitle")
fun setCustomToolbarTitle(view: MyAppBarLayoutCustomView, text: Int) {
// call the method in customview which sets the string value for title view
view.methodnameForsettingTitle(text)
}
我需要为所有屏幕上的工具栏自定义布局,因此我创建了一个扩展 AppBarLayout 的自定义视图 class。它的 xml 包含带有工具栏和 TextView 的 LinearLayout。然后我创建了一个自定义属性来设置 xml 中工具栏的标题。看起来像这样
class MyAppBarLayoutCustomView (...) : AppBarLayout(...) {
init {
val typedArray = context.obtainStyledAttribute(attrs, R.stylable.myAppBarLayoutCustomView, defStyle, 0)
binding.myToolBar.title = typedArray.getString(R.stylable.myAppBarLayoutCustomView_customToolbarTitle) ?: ""
typedArray.recylce()
}
}
如果我只是通过片段中的 xml 设置标题或像这样 activity
就可以正常工作<MyAppBarLayoutCustomView
android:id="@+id/my_app_bar_layout_view"
andorid:layout_width="match_parent"
andorid:layout_height="wrap_content"
app:customToolbarTitle="@string/mainscreen_title"/>
我想要的和不的工作是通过这样的绑定设置标题
<data>
<variable
name="viewModel"
type="com.my.cool.app.MainScreenViewModel/>
</data>
<LinearLayout ...>
<MyAppBarLayoutCustomView
android:id="@+id/my_app_bar_layout_view"
andorid:layout_width="match_parent"
andorid:layout_height="wrap_content"
app:customToolbarTitle="@{viewModel.title}"/>
</LinearLayout>
</layout>
viewModel 中的绑定如下所示
private val _title = NonNullMutableLiveData(R.string.default_title)
val title: NonNullLiveData<Int> = _title
...
_title.postValue(R.string.custom_title)
我得到的错误如下
Cannot find a setter for <MyAppBarLayoutCustomView app:customToolbarTitle> that accepts parameter type 'com...livedata.NonNullLiveData<java.lang.Integer>
If a binding adapter provides the setter, check that the adapter is annotated correctly and that the parameter type matches.
您必须在自定义视图中使用 BindingAdapter class
@BindingAdapter("app:customToolbarTitle")
fun setCustomToolbarTitle(view: MyAppBarLayoutCustomView, text: Int) {
// call the method in customview which sets the string value for title view
view.methodnameForsettingTitle(text)
}