Android UI 详解之LayoutInflater和setContentView

来源:互联网 发布:计算机三级 数据库 编辑:程序博客网 时间:2024/04/28 08:34

                                          Android UI 详解之LayoutInflater

1、LayoutInflater

          LayoutInflater作用是将layoutxml布局文件实例化为View类对象。

 

2、LayoutInflater实例化方法有以下3种

  

LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.main, null);
 
LayoutInflater inflater = LayoutInflater.from(context);
View layout = inflater.inflate(R.layout.main, null);
 
LayoutInflater inflater = getLayoutInflater();(在Activity中可以使用,实际上是View子类下window的一个函数)
View layout = inflater.inflate(R.layout.main, null);

 

3、下面看一个例子

      

public class MyInflate extends Activity{    private TextView tv;    public void OnCreate(Bundle savedInstanceState){        super.onCreate(savedInstanceState);        //setContentView(R.layout.main);        //tv = (TextView) findViewById(R.id.tv);         LayoutInflater inflate = LayoutInflater.from(this);        View view = inflate.inflate(R.layout.main,null);        setContentView(view);    }}

 

所以我们能了解setContentView和inflate的区别

     setContentView可以传递一个resourceId也可传递View对象,如果传递resourceId,也是先实例一个View并显示,

 如果穿的view就直接显示,而inflate就只是加载实例一个view对象,并不显示,所以如果在非activity中控制布局设置操作就只能用inflate

 

4、android上还有一个与Inflate()类似功能的方法叫findViewById(),二者有时均可使用,但也有区别

               inflate是用来找layout下布局文件,并实例化;而findViewById是找布局文件下的具体widget。

 

5、详细剖析一下setContentView

1、setContentView的作用是将View加载到根view之上,这样当显示view时,先显示根view,然后在显示子view,以此类推,最终将所有view显示出来。

2、setContentView必须要放在findviewbyid之前,因为view在加载之前是无法引用的。

3、setContentView最本质的作用是为要显示的view分配内存。

4、activity、window和view之间的关系:

      当我们运行程序的时候,有一个setContentView()方法,Activity其实不是显示视图(直观上感觉是它),实际上Activity调用了PhoneWindow的setContentView()方法,然后加载视图,将视图放到这个Window上,而Activity其实构造的时候初始化的是Window(PhoneWindow),Activity其实是个控制单元,即可视的人机交互界面。

打个比喻:

Activity是一个工人,它来控制Window;Window是一面显示屏,用来显示信息;View就是要显示在显示屏上的信息,这些View都是层层重叠在一起(通过infalte()和addView())放到Window显示屏上的。而LayoutInfalter就是用来生成View的一个工具,XML布局文件就是用来生成View的原料

activity调用setContentView其实是调用window的方法
在activity中:
    public void setContentView(int layoutResID) {
        getWindow().setContentView(layoutResID);
        initActionBar();
    }

在PhoneWindow类中:
    @Override
    public void setContentView(int layoutResID) {
        if (mContentParent == null) {
            installDecor();
        } else {
            mContentParent.removeAllViews();
        }
        mLayoutInflater.inflate(layoutResID, mContentParent);
        final Callback cb = getCallback();
        if (cb != null && !isDestroyed()) {
            cb.onContentChanged();
        }
    }

从上面代码可以看出,最终的根View就是mContentParent,而mContentParent就是installDecor()生成的DecorView。

5、如何在一个activity中显示不同布局?

1)使用LayoutInflater inflate两个view:v1,v2
2)使用setContentView(View view)方法设置这两个view

 

0 0
原创粉丝点击