原文作者: addcn
原文地址: http://my.eoe.cn/addcn/archive/4215.html
Inflate()作用就是将xml定义的一个布局找出来,但仅仅是找出来而且隐藏的,没有找到的同时并显示功能。而setContentView()将布局设置成当前屏幕即Activity的内容,可以直接显示出来。
SetContentView()一旦调用, layout就会立刻显示UI;而inflate只会把Layout形成一个以view类实现成的对象。有需要时再用setContentView(view)显示出来。
注:Inflate()或可理解为“隐性膨胀”,隐性摆放在view里,inflate()前只是获得控件,但没有大小没有在View里占据空间,inflate()后有一定大小,只是出于隐藏状态。
一般在activity中通过setContentView()将界面显示出来,但是如果在非activity中如何对控件布局设置操作了,这需LayoutInflater动态加载。
1 2 3 4 5 6 7 8 9 10 11 |
<TextView
android:id="@+id/tview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="ATAAW.COM" />
<Button
android:id="@+id/button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="按钮" />
|
在程序中动态加载以上布局。
1 2 |
LayoutInflater flater = LayoutInflater.from(this);
View view = flater.inflate(R.layout.example, null);
|
获取布局中的控件。
1 2 |
button = (Button) view.findViewById(R.id.button);
textView = (TextView)view.findViewById(R.id.tview);
|
接下来结合源码说说inflate方法的二种形式:
1.通过 LayoutInflater类的inflate()方法动态加载。两种获得LayoutInflater的方法
a. 通过SystemService获得
1 |
LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLEATER_SERVICE);
|
b. 从给定的context中获取
1 |
Public static LayoutInflater from(Context context)
|
c. 两者的区别:实际上是一样的,源码
1 2 3 4 5 6 7 8 |
public static LayoutInflater from(Context context) {
LayoutInflater LayoutInflater =
(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (LayoutInflater == null) {
throw new AssertionError("LayoutInflater not found.");
}
return LayoutInflater;
}
|
d. 实现代码:
第一步,先获得LayoutInflater对象。
1 |
LayoutInflater inflater=context.getSystemService(Context.LAYOUT_INFLEATER_SERVICE);
|
第二步,调用inflate()方法加载布局资源。
1 |
View view=inflater.inflate(int resource, ViewGroup root);
|
参数1:要加载的xml资源文件,加载出错抛出InflateException异常。
参数2:新生成视图的父层,可设置为NULL。
第三步,将新生成的View加入到需要的View中,我们可以通过findViewById()
方法获取当前Acitivty中的视图MyView,然后把新生成的view加入到Myview中。
1 |
MyView.add(view, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
|
注意:需要指定视图属性。
也可以调用inflater.inflate(int resource, ViewGroup root)方法时直接将视图加入到父视图中。
如:inflater.inflate(R.layout.login,MyView);
这种情况不好控制新视图的长宽。建议使用第一种。
注: LayoutInflater.inflate()将Layout文件转换为View,专门供Layout使用的Inflater。虽然Layout也是 View的子类,但在android中如果想将xml中的Layout转换为View放入.java代码中操作,只能通过Inflater,而不能通过 findViewById()。
第二种方法:使用View的静态方法:
1 |
static View inflate(Context context, int resource, ViewGroup root)
|
参数1:Acitivity或Application的上下文
参数2:指定的xml布局文件
参数3:指定父组件。
同样可以通过:
1 |
View view=View.inflate(this,R.layout.*,null);
|
生成一个新的View,然后调用Add方法指定View的属性并加入的父组件中。
当然也可以使用View.inflate(this,R.layout.*,MyView)
直接加入到父组件中。
findViewById有两种形式 :
R.layout.xx是引用res/layout/xx.xml的布局文件(inflate 方法),R.id.xx是引用布局文件里面的组件,组件的id是xx(findViewById方法)。所有的组件id都能用R.id.xx来查看,但是 组件不在setContentView()里面的layout中就无法使用,Activity.findViewById()会出现空指针异常
a. activity中的findViewById(int id)
b. View 中的findViewById(int id)
6.不同点是LayoutInflater是用来找layout下xml布局文件,并且实例化!而findViewById()是找具体xml下的具体 widget控件(如:Button,TextView等)。
Android上还有一个与Inflate()类似功能的方法叫findViewById(),二者有时均可使用,但也有区别,
区别在于:
findViewById()只能找出当前布局中的组件,即setConentView()的那个layout里的组件.
如果你的Activity里用到别的layout,比如对话框layout,你还要设置这个layout上的其他组件的内容,你就必须用inflate()方法先将对话框的layout找出来,然后再用findViewById()找到它上面的其它组件。例如:
1 2 3 |
View view1=View.inflate(this,R.layout.dialog_layout,null);
TextViewdialogTV=(TextView)view1.findViewById(R.id.dialog_tv);
dialogTV.setText("abcd");
|
注:R.id.dialog_tv是在对话框layout上的组件,而这时若直接用this.findViewById(R.id.dialog_tv)肯定会报错。
1 |
View viewStub = ((ViewStub) findViewById(R.id.stubView)).inflate();
|
参考:
http://blog.csdn.net/uyu2yiyi/article/details/6324335
http://www.eaier.net/?p=107
转载:
http://blog.sina.com.cn/s/blog_5da93c8f0100xm6n.html
补充
http://blog.csdn.net/jj120522/article/details/7905122
"我简单解释下:当root为null的时候,我们只是把一个xml文件实例化成View对象,反回的就是xml对应的View.而当root不为null的时候,也就是存在parent.那么我们将把这个xml实例化程View对象后,将这个View视图add进其parent中.所以在这里我们用的是LayoutInflater.from(context).inflate(R.layout.item, this);这样其实就是把XML实例化后当作自己的一部分,这样我们在调用此控件的时候,显示的就是我们想要的那个视图了(XML视图).说到这里大家明白了.这样以后用的时候再也不会糊涂了.如果想详细了解那么请参考这篇文章:View视图框架源码分析之一:android是如何创建一个view.讲解的那是的相当的透彻,看懂后对于以后我们开发是百利而无一害啊.(^__^)"