问题描述
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ratingView">
...
<attr name="ratingView_progress_value" format="float" />
...
</declare-styleable>
</resources>
在数据绑定时,我调用方法返回 Float 并在 xml 中将其设置为 ratingView_progress_value
:
object DataBindingUtils {
@JvmStatic
fun getScaledrating(rating: Float,base: Float): Float {
return rating / base
}
}
这是我的问题:
如果我输入 .4
- 这部分代码有效:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="model"
type="com.example.app.model.Model" />
<import type="com.example.app.utils.DataBindingUtils" />
</data>
...
<com.example.app.widgets.ratingView
...
app:ratingView_progress_value=".4" />
...
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
但是通过使用 getScaledrating()
- 这部分代码不起作用:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="model"
type="com.example.app.model.Model" />
<import type="com.example.app.utils.DataBindingUtils" />
</data>
...
<com.example.app.widgets.ratingView
...
app:ratingView_progress_value="@{(DataBindingUtils.getScaledrating(model.rating,10f))}" />
...
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
cannot find symbol class FragmentListItembindingImpl
java.lang.reflect.InvocationTargetException (no error message)
Cannot find a setter for that accepts parameter type 'float'
我尝试在另一个参数 @{(DataBindingUtils.getScaledrating(model.rating,.4))}
中使用 android:alpha="@{(DataBindingUtils.getScaledrating(model.rating,.4))}"
,但没有出现任何错误。
我不知道编译器在说什么 setter。有没有人遇到过这样的问题?
解决方法
答案是:Google 的 Android 开发人员不支持布局属性的数据绑定。
第一个来源:https://m.blog.naver.com/wnwogh88/221313835783
问题跟踪器说明:https://issuetracker.google.com/issues/37054474 他们说:
我们明确不支持布局属性的数据绑定,尽管您可以在技术上自己添加它们。问题是这些很容易被试图为它们制作动画的人滥用。
我的解决方案是使用 @BindingAdapter
注释。这是:
@BindingAdapter("app:ratingView_progress_value")
fun setRatingProgressValue(view: RatingView,rating: Float) {
view.progressValue = rating / 10f
}
在 xml 中我刚刚调用了:
<com.example.app.widgets..RatingView
...
app:ratingView_progress_value="@{model.rating}" />