DataBinding初识

简介:

DataBinding常用技巧:

1)default显示预览值(注意不要写中文,否则会提示

Error:org.apache.xerces.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.

2)


DataBinding是Google最新推出的一款技术

   优点

    1)例子1:自定义一个进度条,通过自定义属性prgNum绘制进度值。

         一般是定义一个方法动态设置prgNum,并且调用invalidate方法调用onDraw更新

        如果使用onDraw,那么只需要改变prgNum,不需要给进度条定义任何方法,即可“

        无侵入式”的动态更新进度条。

    2)不用findViewById和类型强转

    3)将事件封装到module里,减小主类的代码。

            


   弊端


    1)因为layout里@{}语句无法检查错误,如大小写出错,容易导致databinding相关的类无法        自动生成。

        另外,xml如果不是databinding造成的错误,提示也会比较少,难以发现错误。

     

     2)对于使用DataBinding的项目,每次进入项目,如果有红色线提示,要clean项目,甚至是重

      启工具。


     ##DataBinding常见错误:

   1) text绑定了data为int型的,会发生source no found的错误。这一点是不同于直text="数

     字",应该写一个函数进行转化。

   2)databinding有非null判断机制,在没有binding.setModel的时候,在xml引用module是没有

    报错的。

    但是不要弄巧成拙,如将bean的类型写成引用类型,这样当值绑定text,很容易空指针

   和类型转换异常。

   3) 当工程重命名或者其它的情况下,databinding的代理类会出现问题,只需要将布局剪切重新

    粘贴一下就可以了。

   4) 使用ObservableField注意要初始化,否则会NullPointer

   5) 使用BaseObservable接口,set方法要依赖于BR,而这个类通常有时不会生成出来,可能导致

     xml往module绑定不成功。如果代码没有问题,BR没有生成,重启as可解决问题。

   6)

    Error:Execution failed for task ':VedioPlay:compileDebugJavaWithJavac'.

    > java.lang.RuntimeException: Found data binding errors.

    ****/ data binding error ****msg:Could not find accessor com.example.btsj.vedioplay.MediaPlayActivity.pause

    file:D:\ChenZhangToolBag\DemoCode\QuickDemos\VedioPlay\src\main\res\layout\activity_mediaplay.xml

    loc:39:35 - 39:52

    ****\ data binding error ****

     绑定的方法不是public就会报这个错。

   7)特别是android studio老是卡住,强制关闭再运行项目就容易出现databinding的BR找不到的错误。

   8)引用自己的函数,当函数的参数类型不匹配,并不会有任何提示。这个很是蛋痛。

  


 

 

   1.Module和View绑定基础:

    http://developer.android.com/tools/data-binding/guide.html

    AndroidStudio版本、Gradle版本、API Leavel都要注意。

    1)在gradle在开启databinding

    2 ) 怎么让module的值发生了变化,让View自动发生变化

            方式1:让module继承BaseObservable,并且在getXXX上加上@Bindable注解,在setXXX方

                        法加上notifyPropertyChanged方法。(一般是在setXXX方法里更新属性,但是也可

                        以在任何方法里更新属性。)

              

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public  class  AA  extends  BaseObservable {
     private  String flag =  "" ;
 
     @Bindable
     public  String getFlag() {
         return  flag;
     }
 
 
     public  void  setFlag(String flag) {
         this .flag = flag;
         notifyPropertyChanged(BR.flag);
     }
     ....
}


     方式2:通过Field

   1-2.Module绑定View的“自定义属性”:     

     图解:

    wKiom1cfCj_z9JeRAAHXlJ6R_zM945.png

 注意Adapter的前缀是android,而不是app。

 绑定的view的属性首字母大小写出错照常运行。

而且更爽是数据链牵一发而动全身,比如 List-Adapter-ListView,如果list改变了,Adapter都不需要

notifyDatasetChanged,ListView就会刷新。



  上面的绑定只是module变了UI会变,如果想UI变了,module也会变,要双向绑定。在xml中@后面要加上=号。

   

2.关于事件的绑定,以按钮的onClick为例:

     1)定义click事件模型:

1
2
3
4
5
6
7
8
9
10
11
< layout  xmlns:android = "http://schemas.android.com/apk/res/android"
     xmlns:tools = "http://schemas.android.com/tools" >
 
     < data >
         < variable
             name = "result"
             type = "cn.xinyi.com.demo1.module.Result" />
         < variable
             name = "handler"
             type = "cn.xinyi.com.demo1.handler.LoginHandler" />
     </ data >


      LoginHandler即为登录按钮的事件模型

  wKiom1cXQNiR-yc1AAISniEHrYU103.png    


  2)在Activity里绑定View和Model

    wKiom1cXQX_w4IgiAACQSAMI_xA183.png

其实上面的CallBack完全可以使用网络请求客户端的CallBack,不需要自定义,有点多余。



2.关于Adapter的绑定,包括ListView 和 RecyclerView的。

   绑定Adapter,不用findViewById,也不用在holder里缓存View,也不需要将data根据position一个个的设置给holder中的view了。

   》》RecyclerView的Adapter的绑定

     网上例子很多,不说了。    

  

   》》ListView的Adapter的绑定

    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@Override
public  View getView( int  position, View convertView, ViewGroup parent) {
     MyViewHolder holder =  null ;
     if (convertView ==  null ){
         ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater
                 .from(parent.getContext()), R.layout.test,  null false );
         convertView = binding.getRoot();
         holder =  new  MyViewHolder();
         holder.setBinding(binding);
         convertView.setTag(holder);
     } else {
         holder = (MyViewHolder) convertView.getTag();
     }
     holder.getBinding().setVariable(BR.bean, mDatas.get(position));
     holder.getBinding().executePendingBindings();
     if (position %  2  ==  0 ){
         holder.getBinding().getRoot().findViewById(R.id.tv).setBackgroundColor(Color.GREEN);
     }
     return  convertView;
}
 
private  class  MyViewHolder{
     private  ViewDataBinding binding;
 
     public  void  setBinding(ViewDataBinding binding) {
         this .binding = binding;
     }
 
     public  ViewDataBinding getBinding() {
         return  this .binding;
     }
}

    

3.自定义组合View的绑定

  亲测,也可以绑定。wKiom1jlqN2TW4fiAABrBGilBRI178.png 


DataBinding虽然好用,但是同时也给我带来了很多苦恼。经常性无缘无故的BR找不到,像是有缓存一样,clean、rebuild、sys、重启电脑都解决不了。

新的技术一定要注意它的坑,技术的造型对后面的工作十分地重要。




----------------------------纪念我的DataBinding的一个大坑-------------------------

在10月14号,我更新了AS到2.2.1,然后电脑突然蓝屏,第二天打开电脑项目就跑不起来了。然后日志报错:但是奇怪的是另外一个哥们的项目clean之后还能跑起来。

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\activity\FindPasswordStepOneActivity.java

Error:(15, 32) 错误: 程序包com.btsj.hpx.databinding不存在

Error:(28, 13) 错误: 找不到符号

符号:   类 ActivityFindPasswordSteponeBinding

位置: 类 FindPasswordStepOneActivity

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\bean\module\FindPasswordStepOneActivityEventHandler.java

Error:(14, 32) 错误: 程序包com.btsj.hpx.databinding不存在

Error:(49, 13) 错误: 找不到符号

符号:   类 ActivityFindPasswordSteponeBinding

位置: 类 FindPasswordStepOneActivityEventHandler

Error:(81, 52) 错误: 找不到符号

符号:   类 ActivityFindPasswordSteponeBinding

位置: 类 FindPasswordStepOneActivityEventHandler

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\activity\FindPasswordStepTwoActivity.java

Error:(11, 32) 错误: 程序包com.btsj.hpx.databinding不存在

Error:(21, 13) 错误: 找不到符号

符号:   类 ActivityFindPasswordSteptwoBinding

位置: 类 FindPasswordStepTwoActivity

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\activity\LoginActivity.java

Error:(15, 32) 错误: 程序包com.btsj.hpx.databinding不存在

Error:(22, 5) 错误: 找不到符号

符号:   类 ActivityLoginNewBinding

位置: 类 LoginActivity

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\bean\module\LoginHandler_Module.java

Error:(24, 32) 错误: 程序包com.btsj.hpx.databinding不存在

Error:(57, 13) 错误: 找不到符号

符号:   类 ActivityLoginNewBinding

位置: 类 LoginHandler_Module

Error:(61, 29) 错误: 找不到符号

符号:   类 ActivityLoginNewBinding

位置: 类 LoginHandler_Module

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\fragment\HomePageFragment.java

Error:(28, 32) 错误: 程序包com.btsj.hpx.databinding不存在

Error:(61, 13) 错误: 找不到符号

符号:   类 FragHomePageBinding

位置: 类 HomePageFragment

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\fragment\PersonalFragment.java

Error:(36, 32) 错误: 程序包com.btsj.hpx.databinding不存在

Error:(49, 13) 错误: 找不到符号

符号:   类 FragPersonal2NewBinding

位置: 类 PersonalFragment

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\activity\NearbyStudentActivity.java

Error:(28, 32) 错误: 程序包com.btsj.hpx.databinding不存在

Error:(44, 13) 错误: 找不到符号

符号:   类 ActivityNearbyStudentBinding

位置: 类 NearbyStudentActivity

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\activity\NearbyStudyCenterActivity.java

Error:(37, 32) 错误: 程序包com.btsj.hpx.databinding不存在

Error:(54, 13) 错误: 找不到符号

符号:   类 ActivityNearbyStudycenterBinding

位置: 类 NearbyStudyCenterActivity

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\activity\person\BrowsedVideosRecordActivity.java

Error:(19, 32) 错误: 程序包com.btsj.hpx.databinding不存在

Error:(41, 13) 错误: 找不到符号

符号:   类 ActivityBrowsedVideosBinding

位置: 类 BrowsedVideosRecordActivity

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\activity\person\PaperRecordDetailActivity.java

Error:(24, 32) 错误: 程序包com.btsj.hpx.databinding不存在

Error:(50, 13) 错误: 找不到符号

符号:   类 ActivityPagerRecordDetailBinding

位置: 类 PaperRecordDetailActivity

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\base\BaseListAdapter.java

Error:(11, 20) 错误: 找不到符号

符号:   类 BR

位置: 程序包 com.btsj.hpx

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\bean\module\FindPasswordStepTwoActivityEventHandler.java

Error:(12, 32) 错误: 程序包com.btsj.hpx.databinding不存在

Error:(31, 13) 错误: 找不到符号

符号:   类 ActivityFindPasswordSteptwoBinding

位置: 类 FindPasswordStepTwoActivityEventHandler

Error:(36, 52) 错误: 找不到符号

符号:   类 ActivityFindPasswordSteptwoBinding

位置: 类 FindPasswordStepTwoActivityEventHandler

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\fragment\SelfTestingFragment.java

Error:(29, 32) 错误: 程序包com.btsj.hpx.databinding不存在

Error:(49, 13) 错误: 找不到符号

符号:   类 FragTestPaperBinding

位置: 类 SelfTestingFragment

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\gensee\GeeseeLiveActivity.java

Error:(32, 32) 错误: 程序包com.btsj.hpx.databinding不存在

Error:(72, 13) 错误: 找不到符号

符号:   类 ActivityGeeseeLiveBinding

位置: 类 GeeseeLiveActivity

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\share\ParseListener.java

Error:(3, 1) 错误: 找不到符号

符号:   静态 T

位置: 类

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\bean\module\LoginParams_Module.java

Error:(7, 20) 错误: 找不到符号

符号:   类 BR

位置: 程序包 com.btsj.hpx

Error:(24, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 LoginParams_Module

Error:(34, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 LoginParams_Module

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\bean\module\StudyPlanModule.java

Error:(6, 20) 错误: 找不到符号

符号:   类 BR

位置: 程序包 com.btsj.hpx

Error:(37, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 StudyPlanModule

Error:(47, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 StudyPlanModule

Error:(58, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 StudyPlanModule

Error:(68, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 StudyPlanModule

Error:(78, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 StudyPlanModule

Error:(88, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 StudyPlanModule

Error:(98, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 StudyPlanModule

Error:(108, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 StudyPlanModule

Error:(118, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 StudyPlanModule

Error:(128, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 StudyPlanModule

Error:(138, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 StudyPlanModule

Error:(148, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 StudyPlanModule

Error:(158, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 StudyPlanModule

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\activity\person\AnswerRecrodDetailBean.java

Error:(6, 20) 错误: 找不到符号

符号:   类 BR

位置: 程序包 com.btsj.hpx

Error:(56, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 AnswerRecrodDetailBean

Error:(74, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 AnswerRecrodDetailBean

Error:(188, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 AnswerRecrodDetailBean

Error:(222, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 AnswerRecrodDetailBean

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\activity\study_circle\StudyCircleDingAdapter.java

Error:(9, 32) 错误: 程序包com.btsj.hpx.databinding不存在

Error:(33, 9) 错误: 找不到符号

符号:   类 AdapterStudyCircleDingListBinding

位置: 类 StudyCircleDingAdapter

Error:(33, 55) 错误: 找不到符号

符号:   类 AdapterStudyCircleDingListBinding

位置: 类 StudyCircleDingAdapter

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\adapter\personal\Personal2OptionsAdapter.java

Error:(6, 20) 错误: 找不到符号

符号:   类 BR

位置: 程序包 com.btsj.hpx

Error:(29, 29) 错误: 找不到符号

符号:   变量 BR

位置: 类 Personal2OptionsAdapter

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\bean\personal\AdapterImageAndTitleBean.java

Error:(6, 20) 错误: 找不到符号

符号:   类 BR

位置: 程序包 com.btsj.hpx

Error:(43, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 AdapterImageAndTitleBean

Error:(53, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 AdapterImageAndTitleBean

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\bean\FragTestPagerAdapter.java

Error:(6, 20) 错误: 找不到符号

符号:   类 BR

位置: 程序包 com.btsj.hpx

Error:(29, 29) 错误: 找不到符号

符号:   变量 BR

位置: 类 FragTestPagerAdapter

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\bean\module\TestPapgerModule.java

Error:(6, 20) 错误: 找不到符号

符号:   类 BR

位置: 程序包 com.btsj.hpx

Error:(26, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 TestPapgerModule

Error:(36, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 TestPapgerModule

Error:(46, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 TestPapgerModule

Error:(56, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 TestPapgerModule

Error:(66, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 TestPapgerModule

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\bean\module\UserModule.java

Error:(6, 20) 错误: 找不到符号

符号:   类 BR

位置: 程序包 com.btsj.hpx

Error:(35, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 UserModule

Error:(45, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 UserModule

Error:(55, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 UserModule

Error:(65, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 UserModule

D:\DevWork\Code\Android\ProBTSJ\Pro1_Student\src\main\java\com\btsj\hpx\bean\personal\Personal2OptionsItemBean.java

Error:(6, 20) 错误: 找不到符号

符号:   类 BR

位置: 程序包 com.btsj.hpx

Error:(29, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 Personal2OptionsItemBean

Error:(39, 31) 错误: 找不到符号

符号:   变量 BR

位置: 类 Personal2OptionsItemBean


各种清理,重做系统,重新配置环境,各种百度,各种databinding群里请教大神。最后还是在看似无解的日志里找到了答案,就是我加深的那个错误日志。




      本文转自屠夫章哥  51CTO博客,原文链接:http://blog.51cto.com/4259297/1765850,如需转载请自行联系原作者





相关文章
|
XML 前端开发 JavaScript
Android MVVM模式入门 - DataBinding的使用
Android MVVM模式入门 - DataBinding的使用
348 0
Android MVVM模式入门 - DataBinding的使用
|
2天前
|
前端开发
MVVM LiveData+DataBinding+Lifecycle+ViewModel架构
MVVM LiveData+DataBinding+Lifecycle+ViewModel架构
12 1
|
12月前
|
XML 移动开发 数据可视化
每日记录自己的Android项目(二)—Viewbinding,WebView,Navigation
今天是想把做一个跳转页面的时候调到H5页面去,但是这个页面我用app来承载,不要调到浏览器去。
146 0
每日记录自己的Android项目(二)—Viewbinding,WebView,Navigation
|
12月前
|
XML Java Android开发
Android——RecyclerView简单实现及Viewbinding优化
本文是博主对Adapter(适配器)的一些理解,为了加深对Adapter的理解以及记录自己的阶段学习而写,同时也适合初学者阅读,参考本条博客的逻辑进行学习。
311 0
|
Android开发 前端开发
Android DataBinding 的使用姿势
Android DataBinding 的使用姿势
|
安全
浅析viewBinding和DataBinding
viewBinding 优点 配置 使用 源码解析 DataBinding 配置 创建实体类 创建布局 创建viewModel dataBinding绑定
457 0
浅析viewBinding和DataBinding
DHL
|
XML 前端开发 算法
竟然如此简单,DataBinding 和 ViewBinding
ViewBinding 和 DataBinding 为我们解决了这么多问题,但是为什么很多小伙伴们不愿意使用 ViewBinding 和 DataBinding,今天我们从使用的角度来分析。
DHL
440 0
竟然如此简单,DataBinding 和 ViewBinding
DHL
|
存储 算法 安全
如何在项目中封装 Kotlin + Android Databinding
如何在项目中封装 Kotlin + Android Databinding
DHL
279 0
如何在项目中封装 Kotlin + Android Databinding
|
XML 安全 Android开发
Android Jetpack 之ViewBinding和DataBinding
Android Jetpack 之ViewBinding和DataBinding
1492 1
Android Jetpack 之ViewBinding和DataBinding
|
前端开发 Android开发 数据格式
Android DataBinding使用(一):DataBinding初体验
目录 前言 MVVM ( Model — View — ViewModel )最初是在2005年由微软提出的一个UI架构概念 。 相比MVP模式,MVVM将Presenter改为了 ViewModel,同时实现View和VievvModel的双向绑定。
2198 0