Data Binding

可以参考:https://developer.android.com/topic/libraries/data-binding/index.html#build_environment


1.我认为data binding库的意义在于将view和Mode(数据)进行绑定,而java代码专注于逻辑代码的编写,不用再关注view对象的问题了,这个时候xml布局文件就不仅仅是布局显示了

   会增加一些逻辑上的控制





转载:https://realm.io/cn/news/data-binding-android-boyar-mount/


介绍 (0:00)

我们是 George Mount 和 Yigit Boyar,在谷歌 Android UI 工具团队。我们有很多关于 Data Binding 的信息要分享给你们。我们会讨论到一些重要到方面,比如 Data Binding 是怎么工作的、如何集成到您到 App 当中、它的原理和如何与一些其他组件共同使用,同时,我们也会给出一些最佳实践示例。

为什么要使用 Data Binding?(0:44)

你可能会想我们为什么决定去实现这么一个库,关于这点,可以先看以下一些传统代码写法的例子:

<LinearLayout >
    <TextView android:id="@+id/name"/>
    <TextView android:id="@+id/lastName"/>
</LinearLayout>

这是一个你经常会看到的 Android UI。 假设你有一堆带 ID 的视频内容。你的设计师来了,说:“好吧,让我们尝试添加新的信息到这个布局,”这样,当你添加任何视频,你需要跟随另外一个 ID。你需要回到你的 Java 代码,修改 UI。

private TextView mName
protected void onCreate(Bundle savedInstanceState) {
  setContentView(R.layout.activity_main);
  mName = (TextView) findViewById(R.id.name);
}

public void updateUI(User user) {
  if (user == null) {
    mName.setText(null);
  } else {
    mName.setText(user.getName());
  }
}

你写了一个新的 TextView,你通过 findViewById 在代码中找到它,同时你把它赋值给了你的变量,使得当你需要更新用户信息的时候,再通过它去给这个 TextView 设置上用户信息。

private TextView mName
protected void onCreate(Bundle savedInstanceState) {
  setContentView(R.layout.activity_main);
  mName = (TextView) findViewById(R.id.name);
  mLastName = (TextView) findViewById(R.id.lastName);
}
public void updateUI(User user) {
  if (user == null) {
    mName.setText(null);
    mLastName.setText(null);
  } else {
    mName.setText(user.getName());
    mLastName.setText(user.getLastName());
  }
}

总的来说,仅仅为了增加一个 View 到你的 UI 当中,你得做好几个步骤的事情。这似乎是比较愚蠢的样板代码,虽然有时它不需要任何脑力。

幸运的是,已经有一些漂亮的库可以简化我们的这些操作。比如你使用 ButterKnife 这个库,能够摆脱讨厌的 findViewById 而获得组件,它让代码更加简洁易读。通过它可以节省很多额外的代码。

private TextView mName
protected void onCreate(Bundle savedInstanceState) {
  setContentView(R.layout.activity_main);
  ButterKnife.bind(this);
}
public void updateUI(User user) {
  if (user == null) {
    mName.setText(null);
    mLastName.setText(null);
  } else {
    mName.setText(user.getName());
    mLastName.setText(user.getLastName());
  }
}

这是很好的一步,但是我们想走得更远。另外,我们可以说:”好吧,为什么我需要这些项目呢?有什么可以直接生成它。我有一个布局文件,我有它们的 IDs.” 所以,你可以使用 Holdr,它可以替你可以处理布局文件,然后为他们创建 View 组件。你通过 Holder,转换 View 的 ID 到组件变量。

private Holdr_ActivityMain holder;
protected void onCreate(Bundle savedInstanceState) {
  setContentView(R.layout.activity_main);
  holder = new Holdr_ActivityMain(findViewById(content));
}
public void updateUI(User user) {
  if (user == null) {
    holder.name.setText(null);
    holder.lastName.setText(null);
  } else {
    holder.name.setText(user.getName());
    holder.lastName.setText(user.getLastName());
  }
}

这种方式也不错,但其中仍然有很多是不必要的代码。而且这里还有一个可能我们没有想到的麻烦、一个我们无论如何无法减少代码量的地方,它也是很简单的代码:我有一个 User 对象,我只是想把数据内容从这个 User 对象转移到 View 当中,但我们往往改了一个地方,忘了另一个地方,最终导致了产品运行崩溃。这也是我们关注的一部分,我们想摆脱所有这些比较蠢的代码。

当你使用 Data Binding,它很像 Holder 模式,而且你只要做一点点事情,其余的内容 Data Binding 会帮你完成。

private ActivityMainBinding mBinding;
protected void onCreate(Bundle savedInstanceState) {
  mBinding = DataBindingUtil.setContentView(this,
                           R.layout.activity_main);
}

public void updateUI(User user) {
  mBinding.setUser(user);
}

“幕后” (3:53)

那么,Data Binding 在幕后是怎么工作的呢? 在此之前可以先看看我们的布局文件:

<LinearLayout >
  <TextView android:id="@id/name"    />
  <TextView android:id="@id/lastName"    />
</LinearLayout>

我们有这些 Views 的 ID,但如果我们能够直接通过 Java 代码找到它们,为什么还需要这些 ID 呢?嗯,我们现在已经不需要它们了,所以我们可以摆脱它们,在这些地方,我可以放一些更加明显的内容。

<LinearLayout >
  <TextView android:text="@{user.name}"/>
  <TextView android:text="@{user.lastName}"/>
</LinearLayout>

现在,当我看这些布局文件,我可以知道这些 TextView 要显示什么,它变得非常明显,所以我没必要再回到我当 Java 代码去阅读它们到底是干什么的。我们设计 Data Binding 库其中一个原因就是不想去用一些看起来不明显不直接的表达方式。使用 Data Binding,你只要简单地告诉它:“我们用这种类型的用户标记这个布局文件,现在我们将要找到它。”而如果你的产品设计经理要求你添加另一个新的 View 进去这个布局,你只要在这个布局文件中加上它,无需改变其他 Java 代码:

<layout>
    <data>
        <variable name="user"
                  type="com.android.example.User"/>
    </data>
    <LinearLayout >
        <TextView android:text="@{user.name}"/>
        <TextView android:text="@{user.lastName}"/>
        <TextView android:text='@{"" + user.age}'/>
    </LinearLayout>
</layout>

同时,它也非常容易寻找 bug. 你可以看着类似上面的代码,然后说:“哦,这是空的字符串加上 user.age!” 这样写是安全正确的,而如果你只是把整形设置给 text 了,它会误以为这是资源索引 resId,找不到对应的资源从而导致崩溃。

但是它怎么工作的呢? (5:57)

Data Binding 做的第一件事就是进入并处理您的布局文件,其中的“进入”指的是,在你的程序代码正在被编译的过程中,它会找出布局文件中所有关于它的内容,获取到它所需要的信息,然后删掉它们,删掉它们的原因是如果继续存着视图系统并不认得它们。

第二步骤就是通过语法来解析这些表达式,例如:

<TextView android:visibility="@user.isAdmin ? View.VISIBLE : View.GONE}"/>

这个 user 是一个索引,之后的 View 也是个索引,另一个 View 也是个索引。它们都是索引或称标识,像是真正的对象,在这边我们真的不知道它们是什么。同样的对于VISIBLEGONE 也是如此。这里面有对象数据访问,是一个三目运算表达式,这就是目前为止我们所理解到的。而对于我们的库,它的工作就是从这些文件中把东西解析出来,了解里面有什么。

第三步就是在你代码编译过程中解决相关依赖问题。在这一步中,例如,我们看一下 user.isAdmin,想:“这是在运行时获取到 User 类对象中的一个布尔值。”

最后一步就是 Data Binding 会自动生成一些你不需要再写的类文件,总之到这里你只要享受它带来的好处

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值