Android LayoutInflater原理分析,带你一步步深入了解View(一) —站在巨人的肩膀上学习总结
详情请看,郭林大神博客 http://blog.csdn.net/guolin_blog/article/details/12921889
一:LayoutInflater的基本用法
//获取到该实例对象
方法一:LayoutInflater layoutInflater = LayoutInflater.from(context);
//获取到该实例对象
方法二:layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//该实例对象的inflater()接受参数是:(如此成功创建好了一个布局实例)
1,需要加载的布局id 如R.layout.textview_layout(tv的布局)
2,是否给当前布局嵌套一层父布局,不需要直接写null即可
需求: 如何在mainLayout(主布局中)添加一个tv_layout?
public class MainActivity extends Activity {
private LinearLayout mainLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainLayout = (LinearLayout) findViewById(R.id.main_layout);
LayoutInflater layoutInflater = LayoutInflater.from(this);
View buttonLayout = layoutInflater.inflate(R.layout.button_layout, null);
mainLayout.addView(buttonLayout);
}
}
可以看到,这里先是获取到了LayoutInflater的实例,然后调用它的inflate()方法来加载
button_layout这个布局,最后调用LinearLayout的addView()方法将它添加到LinearLayout中。
%%%总结,%%%
layoutInflater技术广泛的应用在动态的添加View,常常使用的场景如:在ScrollView和ListView中
二:源码角度分析layoutInflater工作原理
LayoutInflater其实使用的是Android提供的Pull解析XML布局文件的,调用createrViewFromTag()
把节点名字和参数传进去,(所以,View的创建就是根据节点名字来创建的).该方法的内部会调用
createView方法通过范式实现对View实例的创建并返回回去,一个布局文件中含有多个view的时候
会调用rInflater方法循环的遍历,和创建View
三:layout_height和layout_width的理解
我们经常在xml中使用这两个属性设置View的宽和高,但是有些时候不起作用,对吧?那么是为什么呢?
因为这两个属性设置的是View相对应上一级也就是父布局的的布局大小,所以View必须有一个父布局,
最简单的做法就是外出套一个父布局
那么MainActivity不用套一层父布局还可以控制呢?
其实MainActivity外出时套了一层,FrameLayout的,这个是系统帮我添加上去的,
FrameLayout的id是content所以我们调用的setContentView()传入的布局,实质是仿佛FrameLayout中去
这就是为什么叫setContentView而不是setView.