【问题标题】:Android databinding: BindingAdapter vs InverseBindingAdapterAndroid 数据绑定:BindingAdapter 与 InverseBindingAdapter
【发布时间】:2017-08-12 21:07:48
【问题描述】:

两者有什么区别?

什么时候应该使用其中一个?

当我定义 BindingAdapter 时,我必须创建一个逆吗?

【问题讨论】:

    标签: android android-databinding


    【解决方案1】:

    引用我自己的话,来自The Busy Coder's Guide to Android Development

    双向绑定在以下情况下效果很好 将数据存储在模型中的方式与 getter 很好地对齐 和相关小部件的设置器。模型中的 boolean 字段 与选中的属性配合良好 CompoundButtonSwitch 一样,CompoundButton 有 一个isChecked() 方法返回一个boolean 和一个setChecked() 接受boolean

    BindingAdapter 允许您在数据之间创建其他映射 类型和属性,但仅适用于经典模型->视图绑定。 为了在相反的方向完成同样的事情,你结束了 创建一个InverseBindingAdapter。顾名思义,这服务 与BindingAdapter 的基本角色相同,但方向相反, 从小部件中获取数据并使用自定义为模型准备数据 代码。在这里,“为模型准备”意味着将其转换为 适合您的 setter、Observable 字段等的数据类型 型号。

    这很不寻常。

    有些地方用的例子是“如果我 想要将float 绑定到EditText?”。InverseBindingAdapter 看起来像这样:

    @InverseBindingAdapter(attribute = "android:text")
    public static float getFloat(EditText et) {
      try {
        return(Float.parseFloat(et.getText().toString()));
      }
      catch (NumberFormatException e) {
        return(0.0f); // because, um, what else can we do?
      }
    }
    

    问题是如果用户输入了无效的内容 浮点数,如snicklefritzparseFloat() 将失败 带有NumberFormatException。您应该让用户知道他们的 数据输入无效。但是,双向数据绑定不支持 这个,将默认值(例如,0.0f)传递给模型 而是。

    所以,回答你的问题:

    两者有什么区别?

    BindingAdapter 有助于填充数据类型和View 设置器不是数据绑定自己知道如何处理的属性。

    InverseBindingAdapter 有助于在双向绑定中填充视图模型,其中数据类型和 View getter 不是数据绑定自己知道如何处理的东西。

    什么时候应该使用其中一个?当我定义一个 BindingAdapter 时,我必须创建一个逆向吗?

    当您想要的数据类型(例如,float)不是数据绑定必须知道如何填充到小部件属性(例如,EditText 上的 android:text)时,请使用 BindingAdapter,但是无论如何你都想绑定它。

    如果您这样做,并且您想要进行双向绑定,用户在 UI 中的更改会自动更新您的视图模型,很可能您需要匹配的 InverseBindingAdapter 来转换从属性(例如,EditText 的文本)到所需的数据类型(例如,float)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 2017-03-16
      相关资源
      最近更新 更多