专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

Jetpack之DataBinding绑定布局文件是怎样实现

  dataBinding的实现原理是什么?dataBinding是怎么进行数据双向驱动的?
  时间从来不语,却回答了所有。致自己
  本文从定义,用法,原理分析,由浅到深对DataBinding的实现原理进行挖掘,方便各位读者理解。篇幅较长,请耐心阅读。定义:使用声明形式将布局中的界面组件绑定到应用中的数据源。数据的改变直接驱动UI的变化。视图绑定:该模块的build。gradle文件中将dataBinding构建选项设置为true。android{。。。第一种dataBinding{enabledtrue}第二种dataBinding。enabledtrue第三种buildFeatures{viewBindingtrue}}将xml布局中的根布局改成layoutlt;?xmlversion1。0encodingutf8?layoutxmlns:androidhttp:schemas。android。comapkresandroidxmlns:toolshttp:schemas。android。comtoolsxmlns:apphttp:schemas。android。comapkresautodatadataLinearLayoutandroid:layoutwidthmatchparentandroid:layoutheightmatchparenttools:context。MainActivityLinearLayoutlayout在Activity中使用视图绑定overridefunonCreate(savedInstanceState:Bundle?){super。onCreate(savedInstanceState)第一种直接绑定valbinding:ActivityMainBindingDataBindingUtil。setContentView(this,R。layout。activitymain)第二种可以使用LayoutInflater获取视图valbinding:ActivityMainBindingActivityMainBinding。inflate(getLayoutInflater())setContentView(binding。root)}在Fragment中使用视图绑定
  如果要在Fragment、ListView或RecyclerView适配器中使用数据绑定项,使用绑定类或DataBindingUtil类的inflate()方法,如以下代码示例所示:vallistItemBindingListItemBinding。inflate(layoutInflater,viewGroup,false)orvallistItemBindingDataBindingUtil。inflate(layoutInflater,R。layout。listitem,viewGroup,false)
  3数据双向绑定
  DataBinding除了可以进行布局绑定之外,还可以对布局view进行数据绑定。lt;?xmlversion1。0encodingutf8?layoutxmlns:androidhttp:schemas。android。comapkresandroiddatavariablenameusertypecom。example。UserdataLinearLayoutandroid:orientationverticalandroid:layoutwidthmatchparentandroid:layoutheightmatchparentTextViewandroid:layoutwidthwrapcontentandroid:layoutheightwrapcontentandroid:text{user。firstName}TextViewandroid:layoutwidthwrapcontentandroid:layoutheightwrapcontentandroid:text{user。lastName}LinearLayoutlayout
  在根标签layout中添加一个data标签,name为数据bean的别名,type为数据bean的全类名。然后通过给TextView的text属性,布局中的表达式使用{}语法写入特性属性中进行数据绑定。android:text{user。firstName},。在这里,TextView文本被设置为user变量的firstName属性。
  数据对象UserdataclassUser(valfirstName,vallastName)
  然后再Activity中,通过binding。userUser(,)将user变量绑定到布局视图上。overridefunonCreate(savedInstanceState:Bundle?){super。onCreate(savedInstanceState)valbinding:ActivityMainBindingDataBindingUtil。setContentView(this,R。layout。activitymain)binding。userUser(Test,User)}
  这样我们就完成了一个简单是数据到布局视图上的绑定,如果我们修改了user中的某个属性值,视图也会更新吗?我们接着往下看。
  Databinding不仅提供了绑定视图的功能,还提供了动态更新的功能。通过使用可观察的数据对象,通知布局自动更新。classUser{valfirstNameObservableFieldString()vallastNameObservableFieldString()valageObservableInt()}
  首先我们将User对象中的数据定义为可观察的对象属性,当我们修改其中某个变量值得时候,会主动通知布局更新。除此之外还有没有其他办法实现?这个当然有,我们接着往下看。classUser:BaseObservable(){get:BindablevarfirstName:Stringset(value){fieldvaluenotifyPropertyChanged(BR。firstName)}get:BindablevarlastName:Stringset(value){fieldvaluenotifyPropertyChanged(BR。lastName)}}
  通过实现Observable接口将User对象变成一个可观察的对象,以便它们接收有关可观察对象的属性更改的通知。Observable接口具有添加和移除监听器的机制,但何时发送通知必须由您决定。为便于开发,数据绑定库提供了用于实现监听器注册机制的BaseObservable类。实现BaseObservable的数据类负责在属性更改时发出通知。具体操作过程是向getter分配Bindable注释,然后在setter中调用notifyPropertyChanged()方法,如以下示例所示:classUser:BaseObservable(){get:BindablevarfirstName:Stringset(value){fieldvaluenotifyPropertyChanged(BR。firstName)}get:BindablevarlastName:Stringset(value){fieldvaluenotifyPropertyChanged(BR。lastName)}}
  数据绑定在模块包中生成一个名为BR地类,该类包含用于数据绑定的资源的ID。在编译期间,Bindable注释会在BR类文件中生成一个条目。如果数据类的基类无法更改,Observable接口可以使用PropertyChangeRegistry对象实现,以便有效地注册和通知监听器。
  4原理分析
  我们首先来看一下DataBindingUtil是如何绑定xml布局的:DataBindingUtil。setContentView(this,R。layout。activitymain)publicstaticTextendsViewDataBindingTsetContentView(NonNullActivityactivity,intlayoutId,NullableDataBindingComponentbindingComponent){调用当前activity的setContentView方法activity。setContentView(layoutId);ViewdecorViewactivity。getWindow()。getDecorView();通过findViewById获取根布局ViewGroupcontentView(ViewGroup)decorView。findViewById(android。R。id。content);returnbindToAddedViews(bindingComponent,contentView,0,layoutId);}privatestaticTextendsViewDataBindingTbindToAddedViews(DataBindingComponentcomponent,ViewGroupparent,intstartChildren,intlayoutId){获取子view个数finalintendChildrenparent。getChildCount();添加了多少个viewfinalintchildrenAddedendChildrenstartChildren;当只有一个子view时,直接获取ziviewif(childrenAdded1){finalViewchildViewparent。getChildAt(endChildren1);returnbind(component,childView,layoutId);}else{当数量大于1个时,创建view数组用来接收子viewfinalView〔〕childrennewView〔childrenAdded〕;for(inti0;ichildrenAdded;i){children〔i〕parent。getChildAt(istartChildren);}returnbind(component,children,layoutId);}}
  从源码中可以看出不管是只有一个子View还是多个子View,最终都是调用bind()方法,我们接着往下看。staticTextendsViewDataBindingTbind(DataBindingComponentbindingComponent,View〔〕roots,intlayoutId){return(T)sMapper。getDataBinder(bindingComponent,roots,layoutId);}
  通过调用bind方法,我们看到sMapper。getDataBinder返回一个DataBinding对象,那这个getDataBinder方法是怎么返回的呢,我们点进去发现调用到DataBinderMapper。getDataBinder,DataBindingMapper是个抽象类,那我们只能从其子类DataBinderMapperImpl入手。publicViewDataBindinggetDataBinder(DataBindingComponentcomponent,Viewview,intlayoutId){intlocalizedLayoutIdINTERNALLAYOUTIDLOOKUP。get(layoutId);if(localizedLayoutId0){获取布局Objecttagview。getTag();if(tagnull){thrownewRuntimeException(viewmusthaveatag);}switch(localizedLayoutId){case1:如果tag与这个标记相等就new一个ActivityMainBindingImpl返回if(layoutactivitymain0。equals(tag)){returnnewActivityMainBindingImpl(component,view);}thrownewIllegalArgumentException(Thetagforactivitymainisinvalid。Received:tag);}}returnnull;}
  从DataBinderMapperImpl的getDataBinder中,我们终于看到了ActivityMainBindingImpl被创建,ActivityMainBindingImpl是ActivityMainBinding的实现类,至此我们终于知道valactivityMainBindingDataBindingUtil。setContentView(this,R。layout。activitymain)是如果被创建返回的了。
  看到这里很多人有疑问了?layoutactivitymain0。equals(tag)这判断是怎么来的,明明自己没有在布局中没有设置tag标签,那这个tag是从哪来的?带着这个疑问我们进一步深入研究一下。首先我们要知道Databinding是基于APT技术动态生成的,比如上面的ActivityMainBindingImpl等代码都是通过编译自动生成。那么有没有一种可能这个tag标签也是自动生成插入的。我们往下看。
  我们找到编译后的activitymainlayout。xml文件,看一下编译器为我们做了哪些工作?lt;?xmlversion1。0encodingutf8standaloneyes?LayoutlayoutactivitymainmodulePackagecom。example。kotlinprojectfilePathappsrcmainreslayoutactivitymain。xmldirectorylayoutisMergefalseisBindingDatatruerootNodeTypeandroidx。constraintlayout。widget。ConstraintLayoutTargets编译器自动为我们插入一个tagTargettaglayoutactivitymain0viewandroidx。constraintlayout。widget。ConstraintLayoutExpressionslocationstartLine6startOffset4endLine19endOffset55TargetTargetididtvviewTextViewExpressionslocationstartLine10startOffset8endLine18endOffset58TargetTargetsLayout
  我们从编译后的布局文件中可以看到,编译器在第八行自动为我们插入了一个taglayoutactivitymain0标签。用来代替我们在layout根标签的布局文件。至此我们知道了layoutactivitymain0。equals(tag)这个判断添加是怎么来的了,由编译器自动为我们生成而来。
  喜欢这篇文章的小伙伴,欢迎评论区留言,麻烦点个关注或收藏哦,您的支持就是小编创作的最大动力!

如果医生辞职了,能去干啥?别人能干的,都能干!比如去工地扛沙子水泥,去马路边当小工,如果是肛肠外科的,当掏下水道的工人,绝对专业!当医药代表,做销售,开饭店。感谢邀请!医生辞职了可以做很多,毕竟经验和技术还如果你的上司排挤你天天找茬逼你走,动不动让你滚,还说有的是人,你怎么办?一是如果认定经理单纯针对你找茬,可以选择走人。二是如果无法判断经理是在专门针对你,为什么不从自身找找原因,干上一段时间再说呢?说个我在我们单位看到的真人真事。有一年单位来了位新同事刚毕业,年薪20万的外企与年薪十万多的央企该如何选择?别讲大道理了,除非你有雄心壮志,必须年薪百万以上才能满足你的才华,你就去外企。如果没有这个雄心壮志,你就一定要选央企。大概率的事件是,40岁之前,央企的羡慕外企的高薪,40岁之后,被认定为工伤八级,月工资6000元,这种情况可以得到多少钱的赔偿?5万左右员工受伤之后,经过认定为工伤,那么员工只要在达到一定医疗期之后就可以申请劳动能力鉴定,存在内固定的依然可以进行鉴定。工伤流程如下1申请工伤认定。单位在事故发生后一个月内申请5家银行信用卡共欠了8万,几年时间了也没人问,银行是不是忘了?你这不是银行忘记了,而是到了更严重的地步了,就是说银行已经放弃你这笔钱了,将这笔钱归为坏账了。银行逾期一般分为三个月内,六个月内,在这之后就是催收了,不过你这个是5张卡,8万块,可台湾地区学生为什么想来大陆上大学?自从2011年,大陆放宽了台湾学生可以用台湾学测的成绩,免试申请大陆的大学以后,台湾高中毕业生申请去大陆的人数就一直增加!而2017年7月,大陆教育部宣布更放宽台湾高中毕业生凭学力20年没联系的同学,头天加微信,第二天向你借5000元,借吗?不借我和赵同学在高三时是同班同学,他当体育委员,笑眯眯的很和气的一个男同学,很热情,开朗。有一段时间我坐在他的后面,还挺能聊的来,他有时也会把租来的武侠小说借给我看看,因为他,我认中国哪个省份学生学习最辛苦?为什么?首先回答题主的问题我国哪个省份考生最辛苦,竞争最激烈,莫过于河南省。我分析如下,仅供参考,欢迎大家留言探讨!写在前面我国自古以来就有十年寒窗苦读,只为一朝金榜题名的良言古训,考场如老伴退休后,不干家务活,白天打麻将,晚跳广场舞,该怎么劝她?退休了年纪大了也该放松放松了,做点自己想做的事,干点自己感兴趣活都无可厚非。但是凡事得有度,过度了就不可取了也有点过份了,家庭生活就不和谐了,对自己的身心健康就害大与益了。爱打麻将有人说济宁市新机场应该建在济宁邹城兖州和曲阜中间,你怎么看?谢邀!我也谈谈我的看法。一说实话,我也很赞同你的看法,如果把机场建设在济宁曲阜兖州邹城之间,真的是方面了济宁地区管辖下的区市县等地。我们出行那真是方便了不少。济宁机场(嘉祥)二现在你们填高考志愿是怎样一种过程?七分考,三分报。可见填报志愿很重要!俗话说,高考考学生,志愿考家长。这句话充分体现了考生与家长,在这个时期的焦灼与不易。我的职业是指导高考生填报志愿。每年会跟上百位考生及家人接触。
租金收入下跌叠加汇率损失,港资老钱也慌21世纪经济报道记者唐韶葵上海报道近段时间,老牌港资地产商瑞安房地产(0272。HK)主席罗康瑞一直奔波于部分上海区政府,拜会相关负责人。因为瑞安房地产在上海多个区域均有在建商业综为什么瑜伽裤有很多的颜色种类?谢谢邀请。爱豆Lee今天跟大家来分享一下。为什么瑜伽裤有很多的颜色种类?瑜伽裤的搭配有很多种,非常赏心悦目,值得借鉴。瑜伽裤的搭配没有固定的模板,要根据自己的服装风格来搭配,推荐一脸部肤色不均匀,晦暗怎么办呢?首先看看是不是身体五脏有什么问题,脾虚就会导致肤色黄,肝郁导致肤色暗沉,气血不足导致肤色没有光彩,先解决身体内部问题,方可有一个美丽的容颜。其次可以使用优质化妆品,比如日韩牌子的,没有教不好的学生,只有不会教的老师。算不算教育史上最大谬论?教育最重要的是教会学习的能力。自孔子开始,就主张对学生因材施教,要求学生学会举一反三触类旁通。一个好的老师,确实能够最大限度的引导学生发挥自身特长,学有所成,但是这个成不代表这个学300万投资一套房子,限售五年后卖出,需要卖到多少价位才能保本?300万投资一套房子,限售五年后卖出,需要卖到多少价位才能保本。如果是投资房地产的话,应当算一笔账。首先,300万购买银行理财产品年收益可以达到5左右,按5计算,5年的收益是75万中小学教师晋升副高级职称,没有班主任经历可以吗?标准答案来了中小学教师晋升副高级职称,没有班主任工作经历,是完全可以的。但是,嗯,重点在这里,但是必须要有其它教学管理方面的工作经历。在学校里,哪些工作属于教学管理方面的呢?校长教月薪3000,可以买什么代步车?导读月薪3000首选这4款轿车,皮实耐用,小保养仅需300元随着生活水平的提高,车子开始进入了千家万户,其实有一辆家庭用车还是非常方便的,日常代步出行或者是自驾游都非常的好,而且如孩子不喜欢被母亲纠正错误是什么心理?其实我们都是从孩子过来的,也经常会退行成一个孩子,做些孩子气的事。所以理解孩子,就试着设身处地想想就好,换了我,也不喜欢被纠正错误。自尊心,大人有,孩子也有。知道他是什么心理,对您我国二孩生育率明显提升,少儿人口数量增加比重上升,将产生什么影响?如果新生人口的生育真是这样的结果,婴幼儿比重上升的结果,将产生社会更加朝气蓬勃的,生机盎然的影响!经济发展更具有活力,这是大家都希望看到的局面!可是,我长期在农村生活,我的周围没有剖腹产后,肚子大的就像又怀了一个宝宝,怎样做能快速有效的瘦掉肚子?合理饮食科学减肥!大家好我是邵梅很高兴由我来回答这个问题剖腹产后,肚子大的就像又怀了一个宝宝,怎样能快速有效的瘦掉肚子剖腹产剖腹产顾名思义就是在子宫上切个口,因为孩子不能经过正常的孕晚期喝玉米须,绿豆汤,艾叶煮鹅蛋真的可以去胎毒,黄疸吗?孕晚期喝玉米须,绿豆汤,艾叶煮鹅蛋真的可以去胎毒,黄疸吗?胎毒是中医的说法,胎毒主要的症状表现就是孩子出生以后出现痘疹,疮疥,湿疹,胎寒,胎黄等情况,出生以后的婴儿胎毒是从母亲里面
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网