城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

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

7月7日 暗影泪投稿
  dataBinding的实现原理是什么?dataBinding是怎么进行数据双向驱动的?
  时间从来不语,却回答了所有。致自己
  本文从定义,用法,原理分析,由浅到深对DataBinding的实现原理进行挖掘,方便各位读者理解。篇幅较长,请耐心阅读。定义:使用声明形式将布局中的界面组件绑定到应用中的数据源。数据的改变直接驱动UI的变化。视图绑定:该模块的build。gradle文件中将dataBinding构建选项设置为true。android{。。。第一种dataBinding{enabledtrue}第二种dataBinding。enabledtrue第三种buildFeatures{viewBindingtrue}}将xml布局中的根布局改成?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进行数据绑定。?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();添加了多少个viewfinalintchildrenAddedendChildrenstartC当只有一个子view时,直接获取ziviewif(childrenAdded1){finalViewchildViewparent。getChildAt(endChildren1);returnbind(component,childView,layoutId);}else{当数量大于1个时,创建view数组用来接收子viewfinalView〔〕childrennewView〔childrenAdded〕;for(inti0;ichildrenAi){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);}}}
  从DataBinderMapperImpl的getDataBinder中,我们终于看到了ActivityMainBindingImpl被创建,ActivityMainBindingImpl是ActivityMainBinding的实现类,至此我们终于知道valactivityMainBindingDataBindingUtil。setContentView(this,R。layout。activitymain)是如果被创建返回的了。
  看到这里很多人有疑问了?layoutactivitymain0。equals(tag)这判断是怎么来的,明明自己没有在布局中没有设置tag标签,那这个tag是从哪来的?带着这个疑问我们进一步深入研究一下。首先我们要知道Databinding是基于APT技术动态生成的,比如上面的ActivityMainBindingImpl等代码都是通过编译自动生成。那么有没有一种可能这个tag标签也是自动生成插入的。我们往下看。
  我们找到编译后的activitymainlayout。xml文件,看一下编译器为我们做了哪些工作??xmlversion1。0encodingutf8standaloneyes?LayoutlayoutactivitymainmodulePackagecom。example。kotlinprojectfilePathappsrcmainreslayoutactivitymain。xmldirectorylayoutisMergefalseisBindingDatatruerootNodeTypeandroidx。constraintlayout。widget。ConstraintLayoutTargets编译器自动为我们插入一个tagTargettaglayoutactivitymain0viewandroidx。constraintlayout。widget。ConstraintLayoutExpressionslocationstartLine6startOffset4endLine19endOffset55TargetTargetididtvviewTextViewExpressionslocationstartLine10startOffset8endLine18endOffset58TargetTargetsLayout
  我们从编译后的布局文件中可以看到,编译器在第八行自动为我们插入了一个taglayoutactivitymain0标签。用来代替我们在layout根标签的布局文件。至此我们知道了layoutactivitymain0。equals(tag)这个判断添加是怎么来的了,由编译器自动为我们生成而来。
  喜欢这篇文章的小伙伴,欢迎评论区留言,麻烦点个关注或收藏哦,您的支持就是小编创作的最大动力!
投诉 评论

原神圣遗物合成优先级排行,哪个最值得?在原神的3。0版本,又开放了一大批圣遗物的合成,在众多的圣遗物中,哪套最值得合成呢?一份相关投票或许能告诉你答案,看看玩家们的想法吧。14。染血的骑士道154票骑士……24种养脾胃不能吃的食物!脾胃虚弱者必看1、油炸食品:经过高温油炸的食品,蛋白质会发生变质,食用后会破坏人体内的无机盐和一些脂溶性的维生素,妨碍脾胃的消化和吸收功能。另外,油炸食品油脂含量过高,食用后会增加肠胃的负担……Jetpack之DataBinding绑定布局文件是怎样实现dataBinding的实现原理是什么?dataBinding是怎么进行数据双向驱动的?时间从来不语,却回答了所有。致自己本文从定义,用法,原理分析,由浅到深对Da……财熵小康股份变形记导读:7月11日晚,小康股份拟更名为赛力斯,这意味着小康股份的战略重点将转向新能源汽车。随着网红汽车问界交付量的节节攀升,小康股份和华为的合作似乎熬出头了。不过,财熵也发现,小……不是高颅顶,别留黑长直!把林青霞跟李嘉欣放一起,差别看出来没高颅顶是当今娱乐圈经常提及的词儿,意思是发际线到头顶的距离,最好跟发际线到眉毛的距离比例是一比一。坦白说,这要求很高的。能达到这个要求的美女并不是很多。因为很……回望22,奔向23分享你的年终总结,今天偶然看到头条发给我的分享年终总结那我就说说这一年中的自己吧,也好给自己复复盘,查缺补漏,更向23勇往直前。22年春季呢,家里人都让我回到本家,在此时……20年电商老兵IPO过会却被爆出存诸多隐患12月22日,深圳华强电子网集团股份有限公司IPO首发获深交所审核通过。招股书显示,华强电子网近年来业绩出现大规模增长,三年营收超43亿,但公司主业超九成收入来自于线下接单。同……世界杯最新夺冠赔率阿根廷高达1赔10跌出前3阿根廷爆冷输沙特影响颇大北京时间11月23日,2022年卡塔尔世界杯进入第3个比赛日,昨天随着阿根廷爆冷输给沙特阿拉伯,机构再度更新夺冠赔率,其中梅西领衔的阿根廷从7。5……完败!东契奇4298,塔图姆24中11,库兹马预言成真,MV北京时间2022年11月24日,今日NBA比赛,13胜4负的凯尔特人在主场迎战9胜7负的独行侠,塔图姆和东契奇是本赛季MVP的热门人选,这2人的对决备受瞩目。凯尔特人首发:斯马……英国市场管理局苹果和谷歌限制了手机云游戏英国竞争与市场管理局(CMA)日前决定对苹果和谷歌展开深入调查,监查每家公司设置的影响智能手机云游戏访问的限制。此举是在早些时候提出调查两家公司的市场影响力以及对iPho……今日八月初八ampampquot大吉日ampampquot!头条创作挑战赛没了烟火气,人生就是一段孤独的旅程。今日八月初八大吉日!顺应老传统,别忘记吃这8宝,添财添吉祥,快快收藏吧!第一宝饺子:推荐食谱翡翠白菜饺子白菜……注意安全!溯溪露营网红打卡地背后可能存在风险今年夏季全国各地普遍高温公众亲水意愿增强靠山靠水的溯溪、露营等活动成为了出行首选溯溪原指由峡谷溪流的下游向上游克服地形上的各处障碍……
科学家从宇宙的角度看银河系,有一点非常奇怪小沈阳16岁女儿整容式张开,曾被嘲讽为最丑星二代阿房宫,是建于秦朝的宫殿三位世界冠军力挺墨菲!塞尔比职业球员本就应该先拿资格看看买不起的系列,日本松下RFB300收音机,八十年代的精品玩家才是上帝!看看梦幻新诛仙官方是如何宠玩家的对标Postman,高瓴资本加持,ApiPost如何引领AP抖音热卖的智能手表质量堪忧弗格31分郭艾伦仅13中3辽宁轻取北控豪取8连胜生活中无处不见的碳水化合物,对人体的作用有益吗?PS5应该竖放还是横放?网友热议一直竖放没问题张靓颖也难逃发腮,脸盘略显圆润,穿卫衣配小黑裤却还挺好看妈妈的爱四季如梦芳华尽,女人花开香自来语言的教学计划不战造句用不战造句大全李子柒突然断更视频事件,李亚鹏首次发声做出回应张士诚简介课题实验研究阶段总结迪丽热巴难掩自身光芒,这些配角的势头盖过了主角关爱儿童健康发现孩子中毒家长如何处理林木补偿标准是什么一碗糯米粉倒入锅中,筷子一搅,秒变美食,真是高手在民间白领女性时尚养生的六大陷阱

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找