Android UI 詳解之LayoutInflater和setContentView

                                          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

 

發佈了34 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章