|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
这个不用疑惑照做就行了文档:高级库(发动机)UIKit---UI库OBJCUIResponderayoutinflation在Android高低文情况下转换XML文件成View布局对象的时分必要用到。
LayoutInflater这个对象在Android的SDK中很罕见,可是你相对没想到居然可以找到一个利用误区。说不定你的App里就是这么用的!假如你在写APP的时分像以下代码一样利用LayoutInflater的话:
1
inflater.inflate(R.layout.my_layout,null);
请你持续读完这篇文章,稍后我会注释为何如许做不合错误。
熟悉LayoutInflater
起首看一下LayoutInflater的事情道理,有两个重载的版本可使用:
inflate(intresource,ViewGrouproot)和inflate(intresource,ViewGrouproot,booleanattachToRoot)
第一个参数指出要载进的结构文件资本,第二个参数指出视图布局中载进的结构将要放进的根视图。假如有第三个参数,那末它用来决意是不是把载进后的视图绑定到给出的根视图中。
最初两个参数大概会招致一些成绩。假如利用两个参数的版本,Layoutinflater会主动实验把载进的视图绑定到给定的根视图对象中。可是,假如你传送null,体系就不会实验绑定操纵了,不然使用程序就溃散了。
良多开辟者会如许做,以为传送null作为根视图就能够禁用绑定操纵了。良多时分良多开辟者乃至不晓得另有三个参数的Layoutinflater版本的存在,假如这么做的话,也会同时禁用了根视图的一个很主要的函数……可是之前我没有研讨过。
框架中的示例
如今我们来细心看看Android框架关于静态载进结构的场景。
Adapter是最经常使用的场景,我们常常必要利用LayoutInflater来自界说ListView(经由过程重写getView()办法),详细的办法署名是如许的:
1
getView(intposition,ViewconvertView,ViewGroupparent)
Fragment也会用到inflation操纵,经由过程onCreateView()办法创立view的时分会用到。这个办法的署名是如许的:
1
onCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState)
不知你有无注重到这一点,每次Framework必要你往载进一个结构文件时,城市传进一个ViewGroup参数(最初必要绑定到的根视图),假如Layoutinflater设为主动绑定到根视图的话,会抛出一个非常。
以是你想一想看,假如我做绑定操纵的话,为何要给你一个ViewGroup参数呢?现实证实父视图在这个inflation操纵过程当中是很主要的,它管帐算被载进的XML在根元素中的LayoutParams,假如传进null话,就即是是告知框架“我不晓得载进的View要放到哪一个父视图中”。
成绩在于,android:layout_xxx属性会在父视图对象中被从头盘算,了局就是一切你界说的LayoutParams城市被疏忽失落(由于没有已知的父视图对象)。然后你就烦闷“为何框架会疏忽失落我本人界说的结构属性呢?仍是往StackOverFlow上看看,提一个bug吧”。
在python中的函数__xxxNSString字符串NSArray数组NSDictionary字典这些都需要弄很清楚其他的类都是一个套路NSMutableArray这样带Mutable的类代表可变的 |
|