美文网首页
Android Data Binding使用总结

Android Data Binding使用总结

作者: hello_cc | 来源:发表于2016-01-11 15:49 被阅读867次

    给大家推荐一个使用教程精通 Android Data Binding,介绍的很详细,这就不再详细介绍。

    • 目前Data Binding只支持ViewModel改变通知布局改变的单项绑定,不支持双向绑定
    • 如果页面都是用于显示信息的,推荐使用Data Binding。
    • 如果页面包含EditText,由于是单向绑定,当输入框内容改变后,并不会自动给ViewModel赋值,还需要手动获取内容,这种情况不推荐使用。
    • 也可以不使用ViewModel,只是使用Data Binding简化findViewById()

    ViewModel的使用

    • 使用的是字段Observable(还有一种方法直接继承BaseObservable)。
    • 注意成员变量public final
    public class PartyViewModel {
          public final ObservableField<String> name = new ObservableField<>();
          public final ObservableInt count = new ObservableInt();
    }
    

    gradle配置问题

    1. 如何是在library中使用Data Binding,需要在build.gradle中添加
    dataBinding {
           enabled = true
    }
    

    同时主工程build.gradle中也需要添加以上配置。

    1. 报错fix data binding Source folders generated at incorrect location
      解决办法在build.gradle中添加
    libraryVariants.all { variant ->
        variant.outputs.each { output ->
            def variantName = variant.name.capitalize()
            def inputDir = "${buildDir}/intermediates/classes/${variant.dirName}"
            def sourceDir = "${buildDir}/generated/source/dataBinding/${variant.dirName}"
            def copyTask = tasks.create(name: "dataBindingFix${variantName}", type: Copy) {
                from inputDir
                into sourceDir
                include '*/.java'
            }
            tasks["generate${variantName}Sources"].dependsOn copyTask
            variant.addJavaSourceFoldersToModel new File(sourceDir)
        }}
    

    布局文件中的使用

    1. 手动设置生成的Binding文件的名称
    <data class=".binding.PartyBinding" />
    
    1. java.lang.*包中的类会自动导入,如果需要使用其他类,需手动导入。
    <import type="java.util.Date" />
    
    1. 使用自定义类的相关方法
    <import type="com.test.TimeUtil">
    
    <TextView
            android:text="@{TimeUtil.formatDate(party.startTime)}" />
    
    1. 使用三元表达式
    <variable
            name="party"
            type="com.test.viewmodel.PartyViewModel" />
    
    <TextView
            android:text="@{party.count == 0 ? null : String.valueOf(party.count)}" />
    
    1. 使用字符串格式化
      <string name="test_x_count">%1$d人使用</string
    <TextView
           android:text="@{@string/test_x_count(model.count)}" />
    
    1. 使用Data Binding后,tools失效。

    原理分析

    查看build生成的文件(build/intermediates/data-binding-layout-out),布局文件中的layoutdata都没有了,设置过ID的控件多了一个tag属性,按照顺序,binding_1,binding_2,binding_3....
    通过遍历整个布局文件,根据tag属性,找到相应的控件。

    使用过后的一些疑问

    现在MVVM很火,官方推出Data Binding也在支持MVVM,但是实际使用时,对于哪些操作应该放在Activity,哪些放在ViewModel中还是有些纠结。

    相关文章

      网友评论

          本文标题:Android Data Binding使用总结

          本文链接:https://www.haomeiwen.com/subject/dnwqkttx.html