标签: android-binding-adapter

通过数据绑定 API 设置一个众所周知的属性值

我有一个来自自定义视图定义行的自定义属性:

<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

5
推荐指数
1
解决办法
384
查看次数

数据绑定适配器。如何通过ID参考获取视图?

我想指定视图引用作为对 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。我尝试将上下文转换为活动,并且 …

xml data-binding android mvvm android-binding-adapter

5
推荐指数
2
解决办法
2074
查看次数

具有多个参数的数据绑定绑定适配器不起作用

我试图使用数据绑定来加载带有多个参数的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无法识别一样.不确定我做错了什么

android kotlin android-databinding android-binding-adapter

5
推荐指数
1
解决办法
2233
查看次数

为什么这个BindingAdapter在Kotlin中不起作用?

我有一个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中设置绑定适配器的方式完全相同,减去了静态函数.

android kotlin android-binding-adapter

5
推荐指数
1
解决办法
1880
查看次数

BindingAdapter 不适用于 DataBinding

我有一个按钮:

<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)

data-binding android kotlin android-binding-adapter

3
推荐指数
1
解决办法
1369
查看次数

BindingAdapter 中的高阶函数

我在 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

3
推荐指数
1
解决办法
1287
查看次数

自定义视图上的两种方式绑定

我在android中有一个组合视图,其中包含几个textViews和一个EditText。我定义的属性我叫自定义视图textgetTextsetText方法。现在,我想为自定义视图添加一种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

2
推荐指数
1
解决办法
1656
查看次数

无法将硬编码的字符串值传递给 Kotlin 中的 @BindingAdapter

将我的 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)

谢谢

android kotlin android-databinding android-binding-adapter

1
推荐指数
1
解决办法
1156
查看次数

我们如何在自定义数据绑定属性中编写原始字符串?

我为加载图像 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)

data-binding android loadimage android-binding-adapter

0
推荐指数
1
解决办法
607
查看次数