我正在尝试通过 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)
}
但是我仍然有同样的问题。
答案 0 :(得分:2)
android:src
)。 android:src
代替android:userImage
。CircleImageView
是BindingAdapter
的子代,所以不需要在ImageView
中使用CircleImageView
,并与ImageView
成为公用适配器。signup.userImage = "someUrl"
之类的字段,然后使用Bindable
和notify
,否则则不需要两者。ObservableField
而不是扩展BaseObservable
类,则无需使用Bindable
和notify
。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"})
的好文章
答案 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)
}}