[翻译] Android Data Binding(3): 让view id变得不必要

原文地址: https://medium.com/google-developers/android-data-binding-adding-some-variability-1fe001b3abcc#.xjl7y8ohh

你是否看过别人的layout并想:这个值在哪里设置和获取.或者,你觉得不需要findViewById了是很好的一个开始,但仍然存在很多样板代码.Android Data Binding让这个变得简单.

使用ViewHolder模式

假设我们需要在应用中显示用户信息. 在前面,我展示了使用Android Studio
通过如下的layout文件生成一个"View Holder"类:

user_info.xml


    
        
        

        
    

然后给View设置数据:

private void setUser(User user, ViewGroup root) {
    UserInfoBinding binding =
        UserInfoBinding.inflate(getLayoutInflater(), root, true);
    binding.userFirstName.setText(user.firstName);
    binding.userLastName.setText(user.lastName);
    binding.userImage.setImageBitmap(user.image);
}

虽然这看上去要比findViewById好, 但仍然存在很多的样板代码!
可以通过在layout文件中使用data binding表达式来消除这些样板代码,
实现自动赋值.

给变量赋值

首先, 增加一个binding表达式需要的 data 标签以及一个相关变量.
然后, 对于layout中需要赋值的属性, 使用binding表达式.



    
        
    
    
        
        

        
    

标签中的binding表达式表示为 "@{…}" 格式.上述表达式直接将用户的image,firstName,lastName赋值给view的source和text.这样就不用再写样板代码了.但是仍然不知道需要使用那个用户所以需要做分配:

private void setUser(User user, ViewGroup root) {
    UserInfoBinding binding =
        UserInfoBinding.inflate(getLayoutInflater(), root, true);
    binding.setUser(user);
}

很简单!

从上述layout文件可以看到,View没有ID. 那我们在前面文章中试图生成的View Holder呢? 因为数据直接被绑定到了view上, 所以这里就不需要再去访问view了! 只是简单的设置变量,所有事情就完成了.

而且犯错的几率也变小了.例如, 你在横屏模式下没有用户图片,那么就不需要检查ImageView是否存在. 每个layout都会计算binding表达式, 如果没有ImageView,就不会执行更新代码.

这并不意味着View Holder就过时了. 还有很多时候你会需要直接访问view.只是这种情况比以前少了很多.

Include Layouts

那么, 包含的layout怎么办? 同样可以使用该功能, 就想View Holder模式一样.例如, 假设展示用户名称的TextView在一个被包含的layout中:

user_name.xml


    
        
    

    
        

        
    

可以在外层的layout中用如下方式来赋值user变量:



    
        
    
    
        
        
    

当user被设置时(通过代码 binding.setUser(…)), 被包含的layout的user变量也会被设置,因为设置了 *app:user="@{user}"*. 再次注意, 因为被包含的layout的view不需要被直接访问,(我甚至都没有设置id), 这里没有给include设置ID.

你可能感兴趣的:([翻译] Android Data Binding(3): 让view id变得不必要)