inflate方法的用法

原文作者: 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.讲解的那是的相当的透彻,看懂后对于以后我们开发是百利而无一害啊.(^__^)"


你可能感兴趣的:(inflate方法的用法)