在Kotlin中使用数据绑定时找不到属性ImageView的获取器

时间:2018-10-11 04:36:24

标签: android kotlin android-imageview android-databinding

我正在尝试通过 Kotlin 学习数据绑定,并且能够成功实现它以用于编辑文本和文本视图。之后,我尝试将其用于图像视图。我目前正在尝试通过单击imageview为用户提供一个选择其个人资料图片的选项。该代码正常工作,但是当我尝试使用数据绑定适配器将图像设置为视图时,出现以下错误。

  

发现数据绑定错误。   **** /数据绑定错误**** msg:在de.hdodenhof.circleimageview.CircleImageView上找不到属性类型为java.lang.String的属性“ android:userImage”的获取器。文件:/home/parangat-pt-p10/AndroidStudioProjects/ReUsableAndroid/reusable_android/app/src/main/res/layout/activity_signup.xml loc:25:12-31:48 **** \数据绑定错误*** *

下面是我的代码。

ImageView的布局代码

<de.hdodenhof.circleimageview.CircleImageView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_gravity="center_horizontal"
            android:userImage="@{signup.userImage}"
            android:id="@+id/iv_user"
            android:src="@drawable/profile"/>

模型类代码

    class Signup {
    var userImage=""
    var firstName=""
    var lastName=""
    var phoneNumber=""
    var postCode=""
    var country=""
    var email=""
    var password=""
    var confirmPassword=""
    var isAcceptTerms=false

    @BindingAdapter("android:userImage")
    fun loadImage(view: CircleImageView, imageUrl: String) {
        userImage=imageUrl
        Glide.with(view.context).load(imageUrl).into(view)

    }
}

这是用户选择图片后的工作

override fun onSingleImageSelected(uri: Uri?) {
    signupBinding.signup?.loadImage(iv_user,uri.toString())

}

由于这是用kotlin编写的,因此不需要定义getter和setter方法,但是错误指出找不到getter方法。

按照Enzokie的建议,我在如下所示的单独文件中创建了绑定适配器

@BindingAdapter("userImage")
fun loadImage(view: CircleImageView, imageUrl: String) {
    Glide.with(view.context).load(imageUrl).into(view)
}

但是我仍然有同样的问题。

4 个答案:

答案 0 :(得分:2)

正确方法

  • 使用Observable / Live Data
  • 单独制作一个绑定适配器类,不要弄乱模型中的内容。
    • 是的教程可以这样做,因为它们只是在教您。
    • 只需为整个应用程序制作一个公共绑定适配器(例如android:src)。
  • 直到需要时才需要使用自定义名称空间。因此,您可以使用android:src代替android:userImage
  • 因为CircleImageViewBindingAdapter的子代,所以不需要在ImageView中使用CircleImageView,并与ImageView成为公用适配器。

最终密码

  • 如果您需要手动更改signup.userImage = "someUrl"之类的字段,然后使用Bindablenotify,否则则不需要两者。
  • 如果您使用ObservableField而不是扩展BaseObservable类,则无需使用Bindablenotify

Signup.class

class Signup : BaseObservable() {
    @get:Bindable
    var userImage: String = ""
        set(value) {
            field = value
            notifyPropertyChanged(BR.userImage)
        }
}

DataBindingAdapter.kt

 // binding adapter for setting url/uri on ImageView
@BindingAdapter("android:src")
fun setImageUrl(view: ImageView, url: String) {
    Glide.with(view.context).load(url).into(view)
}

layout.xml

<de.hdodenhof.circleimageview.CircleImageView
            ...
            android:src="@{signup.userImage}"/>

现在您可以设置binding.signup.userImage = "Url",它将自动在用户界面上显示。

仅此而已!

失败的原因

使用数据绑定时,要在设置字段后自动更新UI。那么您的模型应为以下之一:

在您的情况下,最初您的URL为空(“”)。现在,当您以编程方式在一段时间后设置图像时,UI不会收到通知,因为您没有像我上面所说的那样使用任何观察选项。

了解更多信息

两者之间的区别是,实时数据是Android Lifecycle Aware(活动/片段/服务)。

  

LiveData是可观察的数据持有者类。不像普通的   可以观察到,LiveData具有生命周期意识,这意味着它尊重   其他应用程序组件的生命周期,例如活动,片段或   服务。这种意识确保LiveData仅更新应用程序组件   处于活动生命周期状态的观察者。

答案 1 :(得分:1)

尝试删除android TAG

@BindingAdapter("userImage")
fun loadImage(view: CircleImageView, imageUrl: String) {
    userImage=imageUrl
    Glide.with(view.context).load(imageUrl).into(view)

}

AND

<de.hdodenhof.circleimageview.CircleImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_gravity="center_horizontal"
        app:userImage="@{signup.userImage}"
        android:id="@+id/iv_user"
        android:src="@drawable/profile"/>

答案 2 :(得分:1)

使用此

39250E6B-DB60-496E-8770-225EDB29A85F,0,ar,2018-10-09 00:00:00.0,2018-10-09 00:00:04.0,United Arab Emirates
2b98d4f4-0c55-4906-82ec-cfc7c5380652,40967837,en,2018-10-09 00:00:01.0,2018-10-09 00:00:31.0,Qatar
5bb587bc-54a0-4873-b0ba-2da38458ba1c,0,en,2018-10-09 00:00:03.0,2018-10-09 00:04:02.0,United Arab Emirates
466B96B5-DC12-4A35-8865-3A8702037A23,0,ar,2018-10-09 00:00:04.0,2018-10-09 00:00:06.0,Saudi Arabia
be51265e-ab8b-462c-928b-8dd7fab608de,0,ar,2018-10-09 00:00:06.0,2018-10-09 00:02:23.0,Jordan
9abb8b2c-beca-43b3-ab15-3df34bbbe69c,0,ar,2018-10-09 00:00:06.0,2018-10-09 00:00:06.0,United Arab Emirates
0841630C-D869-48E5-BCD3-533F4BD8764C,0,ar,2018-10-09 00:00:09.0,2018-10-09 00:00:13.0,Turkey
bb2cbcad-1580-4aa0-b9bf-d4f8a99cc493,46130751,id,2018-10-09 00:00:09.0,2018-10-09 15:45:02.0,Indonesia
61EA3935-495B-4C5A-A9CD-4ACC66FD5A47,46130713,ar,2018-10-09 00:00:11.0,2018-10-09 00:00:21.0,Kuwait
A7CADD7A-36D7-4B21-ADED-A5CAA2DD73F7,0,ar,2018-10-09 00:00:12.0,2018-10-09 00:00:12.0,Saudi Arabia
7c3187ea-f0f7-4da4-96b3-d0b118cd12a4,0,ar,2018-10-08 00:00:03.0,2018-10-08 18:12:59.0,Saudi Arabia
a0b7e6ad-8ef0-4259-b791-2e0c921a078e,46085131,en,2018-10-08 00:00:05.0,2018-10-08 00:02:20.0,Saudi Arabia
5418ab39-2cf5-4b66-9b9b-bce2be6c17d2,0,en,2018-10-08 00:00:06.0,2018-10-08 00:00:06.0,United Arab Emirates
74314d88-0e5c-46b6-97b3-2cdbf1c23a3e,0,en,2018-10-08 00:00:10.0,2018-10-09 21:18:16.0,United Arab Emirates
2D5D50B5-9570-490F-8B1A-D36F73B34AE7,46085073,ar,2018-10-08 00:00:11.0,2018-10-08 02:17:47.0,Saudi Arabia
1c74c1a4-c921-44b4-9941-ba6c2995360b,0,en,2018-10-08 00:00:11.0,2018-10-08 00:03:34.0,Saudi Arabia
8443DD2B-8A11-4C59-A72C-F9CCA22A5D98,46085077,ar,2018-10-08 00:00:11.0,2018-10-08 00:00:23.0,Saudi Arabia
B49E4117-4BE6-46E0-A7C5-40E99CAD580B,0,ar,2018-10-08 00:00:12.0,2018-10-08 00:00:17.0,Saudi Arabia
3E144DB2-9BA9-4E2E-854A-59FF52AD91DC,10715907,ar,2018-10-08 00:00:14.0,2018-10-08 00:00:20.0,Saudi Arabia
d312445e-3a7d-4678-85f3-076353ffd13c,0,en,2018-10-08 00:00:15.0,2018-10-08 00:00:15.0,Kuwait

代替这个

39250E6B-DB60-496E-8770-225EDB29A85F
2b98d4f4-0c55-4906-82ec-cfc7c5380652

if (b.hasClass("wpcf7-field-group-add")) { var d = c.data("group-model").clone(); c.append(d), b.trigger("wpcf7-field-groups/added"), b.closest(".wpcf7-field-group button").hide(); } else { b.trigger("wpcf7-field-groups/removed"), b.closest(".wpcf7-field-group").remove(); }

@BindingAdapter({"bind:userImage"})

这是Loading images with data binding

的好文章

答案 3 :(得分:0)

根据Khemraj给出的答案,请确保已将“绑定适配器”标记为@JvmStatic,并且应将其添加到@BindingAdapter批注上方。我浪费了一整天,因为在绑定适配器注释之后添加了jvmstatic。

object ImageBindingAdapter {
@JvmStatic
@BindingAdapter("android:src")
fun setImage(imageView: ImageView, uri: String) {
    Glide.with(imageView.context).load(uri).placeholder(R.drawable.no_image).error(R.drawable.no_image).centerCrop().into(imageView)
}}