Android中的数据绑定无法使用java.langString找到setter

时间:2019-10-04 14:40:23

标签: android-layout kotlin android-databinding

我正在使用自定义组件进行数据绑定,并且在尝试将字符串绑定到xml中的值时遇到了困难。

这是xml中的xml组件。问题是用progressText字符串替换了动态变量。我得到

  

找不到接受参数类型'java.lang.String'

尝试编译xml时出现

错误。

            <com.mycompany.CircleProgressBar
                xmlns:cpb="http://schemas.android.com/apk/res-auto"
                android:id="@+id/progressWheel"
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:layout_centerInParent="true"
                android:layout_margin="10dp"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"
                cpb:progress="@{viewmodel.progress}"
                cpb:progressColor="@color/colorPrimary"
                cpb:backgroundColor="@color/gray"
                cpb:backgroundWidth="10"
                cpb:textSize="10sp"
                cpb:differenceInTextSizeInLines="10"
                cpb:roundedCorners="true"
                cpb:progressText="@{@string/work_package_percent_complete(viewmodel.progress)}"
                cpb:spaceBetweenLines="5"
                cpb:maxValue="100"
                cpb:progressTextColor="@color/colorPrimary" />

这是我声明在CircleProgressBar中使用的变量的方式:

@BindingAdapter("progressText")
fun setTextView(view: CircleProgressBar, value: String) {
    if (this::ta.isInitialized) {
        this.text = ta.getString(R.styleable.CircleProgressBar_progressText) as String
    } else {
        this.text = value
    }
    view.invalidate()
}

当我尝试在xml文件的顶部为String进行导入语句时,我得到的重复信息是已经声明了String。如果我只输入纯文本而不替换字符串,则一切正常。

1 个答案:

答案 0 :(得分:0)

BindingAdapter似乎经常被滥用,因为它对于简单的绑定来说是过大的杀伤力。想法是生成这些,而不是对其进行编程-并且具有预期名称的String getter / setter就足够了。为了公开预期的方法,只需调用这些方法:

  • setProgressText(value: String)
  • getProgressText()

CircleProgressBar是一个字段时,不必将其传递到方法中,以保留预期的方法签名,而对于它的显式抱怨则缺少它。它甚至不必是视图模型中的一个字段,因为该模型不应依赖于视图。