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

问题描述

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

<?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}" />