在Kotlin中进行数据绑定时,自定义视图的属性不接受浮点数。

3

我正在创建自定义视图。它具有自己的属性:

<?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是什么。是否有人遇到过这样的问题?


我能稍微了解一下吗?我不明白。当布局放置时,您如何使用自定义属性来设置模型为空,因此第一次绘制的值将如何设置?我认为这里应该是一个绑定属性而不是自定义视图属性“ratingView_progress_value”。如果我错了,请纠正我。 - ADM
在 XML 中,我还有一个存储数据的模型。我只是没有在这里提到它。 - deadfish
我更新了代码。 - deadfish
你能分享一下你的“RatingView”的代码吗? - Sdghasemi
RatingView 中,您是否有一个公共的 ratingView_progress_value Setter? - ADM
是的,我有一个公共的 setter。 - deadfish
1个回答

1
答案是: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}" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接