标签:
LayoutInflater一定不会陌生,都会知道它主要是用于加载布局的
因为加载布局的任务通常都是在Activity中调用setContentView()
setContentView()方法 的内部就是用LayoutInflater实现的。、只不过这部分源码是internal的,不太容易查看到
法1、
LayoutInflater layoutInflater = LayoutInflater.from(context);
法2、
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
其实第一种就是第二种的简单写法,只是Android给我们做了一下封装而已。得到了LayoutInflater的实例之后就可以调用它的inflate()方法来加载布局了,
layoutInflater.inflate(resourceId, root);
inflate()方法一般接收两个参数,
第一个参数就是要加载的布局id
第二个参数是指给该布局的外部再嵌套一层父布局,如果不需要就直接传null。这样就成功成功创建了一个布局的实例,之后再将它添加到指定的位置就可以显示出来了。
mainLayout.addView(buttonLayout);
LayoutInflater技术广泛应用于需要动态添加View的时候,比如在ScrollView和ListView中,经常都可以看到LayoutInflater的身影。
LayoutInflater其实就是使用Android提供的pull解析方式来解析布局文件的。
createViewFromTag()这个方法,并把节点名和参数传了进去。看到这个方法名,我们就应该能猜到,它是用于根据节点名来创建View对象的。确实如此,在createViewFromTag()方法的内部又会去调用createView()方法,然后使用反射的方式创建出View的实例并返回。
LinearLayout的父布局确实是一个FrameLayout,而这个FrameLayout就是由系统自动帮我们添加上的。
我们调用setContentView()方法时所传入的布局其实就是放到这个FrameLayout中的,这也是为什么这个方法名叫作setContentView(),而不是叫setView()。
Android--自定义控件(一) LayoutInflater
标签:
原文地址:http://www.cnblogs.com/zrui513/p/4967731.html