【问题标题】:Using custom binding adapter to bind drawable resource使用自定义绑定适配器绑定可绘制资源
【发布时间】:2019-08-24 15:01:56
【问题描述】:

我正在尝试在我的视图模型和 UI 中的一个对象的两个属性之间建立数据绑定。

该对象有两个属性nameiconName,我可以通过视图模型中的Getter-/Setter-Methods 访问它们。

name 属性是一个简单的 String 字段,绑定到 EditText 组件。

但是,iconName 属性是位于 drawable 目录中的 XML 文件的资源名称,它应该被绑定为 ImageView 组件的源。

手动更改 ImageView 组件的来源就像调用一样简单:

int resId = getResources().getIdentifier(iconName, "drawable", getPackageName());
selectedIconView.setImageResource(resId);

在 Activity 类中。

但现在我不确定如何在 Binding Adapter 中提取资源 ID 以更新 ImageView,因为我的 Binding Adapter 中似乎没有 Context。

public class SubjectAdapter {
    @BindingAdapter("app:subjectName")
    public static void setSubjectName(EditText view, SubjectEntity subject) {
        view.setText(subject.getName());
    }

    @BindingAdapter("app:srcCompat")
    public static void setSubjectIcon(ImageView view, SubjectEntity subject) {
        String iconName = subject.getIconName();
        // TODO: Set Image Resource of view
    }
}

【问题讨论】:

  • 为什么不直接在你的对象中存储图标resourceId呢? @DrawableRes private int iconResourceId 在您的 SubjectEntity 类中和 imageView.setImageResource(subject.getIconResourceId()) 在您的 setSubjectIcon() 方法中
  • 我将这些实体存储在房间数据库中。添加/删除新可绘制对象时,存储资源 ID 可能会造成混淆 (stackoverflow.com/a/47797433/6920681)

标签: java android android-databinding


【解决方案1】:

如果您有任何View,获取Context 就像在视图上调用getContext() 一样简单。

@BindingAdapter("app:srcCompat")
public static void setSubjectIcon(ImageView view, SubjectEntity subject) {
    String iconName = subject.getIconName();
    Context context = view.getContext();
    String packageName = context.getPackageName();
    int resId = context.getResources().getIdentifier(iconName, "drawable", packageName);
    view.setImageResource(resId);
}

【讨论】:

    【解决方案2】:

    让您的适配器函数接收值(资源 ID):

    class MyViewModel : ViewModel() {
    
        companion object {
            @BindingAdapter("app:srcCompat")
            @JvmStatic
            fun setImageViewResource(imageView: ImageView, resource: Int) {
                imageView.setImageResource(resource)
            }
        }
    }
    

    此代码是从生成的类中调用的,因此它不必一定在您的视图模型中。

    【讨论】:

    • 我不确定这如何回答我的问题。如果我只有资源名称,适配器函数如何接收资源 ID?
    • 哦,你到底要传递什么给app:srcCompat="@{...}"?我假设了一个资源 ID。
    • 我目前正在尝试通过我的 SubjectEntity 对象,其中包含属性 iconName。正如您在我当前的 BindingAdapter 方法 (setSubjectIcon) 中看到的那样,然后我通过 Getter 获取此属性。但它s not a resource ID. Its“只”是资源名称。
    • 可以用 ImageView 的上下文提取它吗?可能有助于发布您的 SubjectEntity 代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 2021-12-03
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多