我有一个来自自定义视图定义行的自定义属性:
<declare-styleable name="ExampleView">
<attr name="order">
<enum name="byValue" value="0" />
<enum name="byKey" value="1" />
</attr>
<!-- and some more attributes -->
</declare-styleable>
Run Code Online (Sandbox Code Playgroud)
Android Studio 检测到这一点并为我提供自动完成功能,这很棒。所以 xml 属性看起来像app:order="byValue". 但是,由于我想使用BindingAdapter数据绑定 API 中的 a,因此我需要将它与这样的@符号一起使用:app:order="@{byValue}",不幸的是这不能编译。
然后我尝试使用我在内部使用的常量,如下所示:app:order="@{com.example.views.ExampleView.ORDER_BY_VALUE}",但这也不能编译。我可以只使用app:order="@{0}",确保这有效,因为它是这样定义的,但是为什么我在0那里使用它并不直观。
知道如何编写更具可读性的代码来解决此问题吗?
android android-attributes android-databinding android-binding-adapter
我想指定视图引用作为对 ImageView
@BindingAdapter(value = {"imageUrl", "progressView"}, requireAll = false)
public static void setImageUrl(ImageView imageView, String url, @IdRes int progressBar) {
Context context = imageView.getContext();
View progressView = imageView.getRootView().findViewById(progressBar);
progressView.setVisibility(View.VISIBLE);
Glide.with(context).load(url).listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
if (progressView!= null) {
progressView.setVisibility.setVisibility(View.GONE);
}
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
if (progressView!= null) {
progressView.setVisibility(View.GONE);
}
return false;
}
}).crossFade().into(imageView);
}
Run Code Online (Sandbox Code Playgroud)
但是我的进度视图为null。我尝试将上下文转换为活动,并且 …
我试图使用数据绑定来加载带有多个参数的Glide,Imageview和Bindingadapter的图像:
@BindingAdapter(value = ["url", "defaultImage", "placeholder", "circleCrop"], requireAll = false)
fun ImageView.setImageUrl(url: String, defaultResId: Int? = null, placeHolderResId: Int? = null, circleCrop: Boolean = false) {
val glideRequest = if (defaultResId != null) GlideApp.with(context).loadOrDefault(url, defaultResId)
else GlideApp.with(context).load(url)
if (placeHolderResId != null) glideRequest.placeholder(placeHolderResId)
if (circleCrop) glideRequest.circleCrop()
glideRequest.into(this)
}
<ImageView
android:id="@+id/imgProfile"
android:layout_width="@dimen/size_avatar_search_result"
android:layout_height="0dp"
app:circleCrop="@{true}"
app:defaultImage="@{@drawable/default_avatar}"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:placeholder="@{@drawable/default_avatar}"
app:url="@{item.profilePhotoUrl}"
tools:src="@drawable/default_avatar" />
Run Code Online (Sandbox Code Playgroud)
bindingadapter方法是顶级函数.在编译时,我得到了数据绑定kapt错误'无法找到属性的设置者'app:circleCrop',在android.widget.ImageView上有参数类型boolean',就像我的bindingadapter无法识别一样.不确定我做错了什么
我有一个ViewModel:
val imageUrl = ObservableField<String>()
Run Code Online (Sandbox Code Playgroud)
我的布局XML有:
<ImageView
...
app:url="@{viewModel.imageUrl}"
.../>
Run Code Online (Sandbox Code Playgroud)
我有一个顶级函数的BindingAdapters文件:
@BindingAdapter("url")
fun loadImage(view: ImageView, url: String?) {
...
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
data binding error msg:Cannot find the setter for attribute 'app:url' with parameter type android.databinding.ObservableField<java.lang.String> on android.widget.ImageView.
Run Code Online (Sandbox Code Playgroud)
知道为什么会这样吗?这与我在Java中设置绑定适配器的方式完全相同,减去了静态函数.
我有一个按钮:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:binding="http://schemas.android.com/tools">
<data>
<variable
name="vm"
type="com.MyViewModel" />
</data>
<Button
binding:singleParameterString="test"
binding:firstStringParameter="@{vm.userName}"
.../>
...
Run Code Online (Sandbox Code Playgroud)
BindingAdapter 如下所示:
@BindingAdapter("binding:singleParameterString", "binding:firstStringParameter")
fun setFormattedString(btn: Button, singleParameterString: String, firstStringParameter: String) {
btn.text = String.format(singleParameterString, firstStringParameter)
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,它给出了以下错误:“在 android.widget.Button 上找不到参数类型为 java.lang.String 的属性 'binding:firstStringParameter' 的设置器。”。但是,如果我更改 binding:firstStringParameter="@{vm.userName}"为,例如, binding:firstStringParameter="my lovely string"这将起作用。
ViewModel 中的用户名是val userName: String = "my name",如果我尝试android:text="@{vm.userName}"这样做。所以问题出在数据绑定上。我有另一个项目,我使用了相同的代码并且它可以工作......听起来像是数据绑定/适配器绑定框架中的一个错误,但也许有人遇到了这个问题?
PS我也试过binding:firstStringParameter="@{ + vm.userName}",没用。
通过查看自动生成的 Binding 类,我发现了一个非常奇怪的代码:
blah.setFormattedString(this.mboundView1, (java.lang.String)null, javaLangStringVmUserName);
Run Code Online (Sandbox Code Playgroud) 我在 android 中使用 DataBinding 并且我有一个自定义视图:CarouselView
我为此编写了一个绑定适配器:
@BindingAdapter("onClick")
fun setOnClick(carouselView: CarouselView, onClick: (position: Int) -> Unit) {
carouselView.setImageClickListener { position ->
onClick.run(position)
}
}
Run Code Online (Sandbox Code Playgroud)
在 xml 中:
<com.synnapps.carouselview.CarouselView
android:id="@+id/carouselView"
...
app:onClick="@{(p) -> vm.onAdsClicked(p)}"/>
Run Code Online (Sandbox Code Playgroud)
但它不编译。所以我在 Stackoverflow 中看到了这个答案。但我的问题是我不能使用 Runnable 而不是 kotlin hoc 函数,因为我需要传递一个参数来运行。
我该如何解决?
android higher-order-functions kotlin android-databinding android-binding-adapter
我在android中有一个组合视图,其中包含几个textViews和一个EditText。我定义的属性我叫自定义视图text和getText,setText方法。现在,我想为自定义视图添加一种2方向数据绑定,将其绑定到内部编辑文本,因此,如果我的数据得到更新,则编辑文本也应同时更新(现在可以使用),并且当我的编辑文本得到更新时,数据也应更新。
我的绑定类看起来像这样
@InverseBindingMethods({
@InverseBindingMethod(type = ErrorInputLayout.class, attribute = "text"),
})
public class ErrorInputBinding {
@BindingAdapter(value = "text")
public static void setListener(ErrorInputLayout errorInputLayout, final InverseBindingListener textAttrChanged) {
if (textAttrChanged != null) {
errorInputLayout.getInputET().addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
textAttrChanged.onChange();
}
});
}
}
}
Run Code Online (Sandbox Code Playgroud)
我试图用下面的代码绑定文本。userInfo …
data-binding android android-binding-adapter two-way-binding
将我的 Android 应用程序 Java 代码转换为 Kotlin,我使用数据绑定将自定义字体设置为 TextViews。我曾经从 XML 传递字体字符串,如下所示
app:customFont="@{'harmonia-semibold.ttf'}"
将@BindingAdapter 转换为 kotlin 后,上面的行不起作用,并且预期会抛出expr 或 lambda 表达式,出现 '''错误。用 getter 方法替换硬编码的字符串值非常有效。下面是我的绑定适配器,不知道为什么它不采用硬编码字符串
@JvmStatic
@BindingAdapter("app:customFont")
fun setCustomFont(textView: TextView, font: String) {
textView.typeface = Typeface.createFromAsset(textView.context.assets, font)
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我为加载图像 url 编写了一个自定义属性,如下所示:
@BindingAdapter("srcCircleUrl")
fun loadCircleImage(view: ImageView, imageUrl: String) {
loadImage(view.context, imageUrl, view, options = circleCropTransform())
}
Run Code Online (Sandbox Code Playgroud)
当我想在 xml 中设置一个原始字符串时,它给了我srcCircleUrl attribute not found错误。
例如,如果我写这样的东西,它不起作用:
<ImageView
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
app:srcCircleUrl="https://66.media.tumblr.com/97bcd9782631f8bef87bb30e830344a6/tumblr_owxu10zbPB1tl4ciuo4_250.png"
android:scaleType="centerCrop"
tools:srcCompat="@drawable/flag_iran" />
Run Code Online (Sandbox Code Playgroud)
所以,问题是,如何将原始字符串作为自定义数据绑定属性的输入?
我还测试了这些方法:
app:srcCircleUrl="@{https://66.media.tumblr.com/97bcd9782631f8bef87bb30e830344a6/tumblr_owxu10zbPB1tl4ciuo4_250.png}"
app:srcCircleUrl="@{`https://66.media.tumblr.com/97bcd9782631f8bef87bb30e830344a6/tumblr_owxu10zbPB1tl4ciuo4_250.png`}"
Run Code Online (Sandbox Code Playgroud)