layoutInflater的用法2

在實際開發中LayoutInflater這個類還是非常有用的,它的作用類似於findViewById()。不同點是LayoutInflater是用來找res/layout/下的xml佈局文件,並且實例化;而findViewById()是找xml佈局文件下的具體widget控件(如Button、TextView等)。
具體作用:
1、對於一個沒有被載入或者想要動態載入的界面,都需要使用LayoutInflater.inflate()來載入;


2、對於一個已經載入的界面,就可以使用Activiyt.findViewById()方法來獲得其中的界面元素。




LayoutInflater 是一個抽象類,在文檔中如下聲明:


public abstract class LayoutInflater extends Object  


 


獲得 LayoutInflater 實例的三種方式


LayoutInflater inflater = getLayoutInflater();  //調用Activity的getLayoutInflater()


LayoutInflater localinflater =  (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);


LayoutInflater inflater = LayoutInflater.from(context);   

其實,這三種方式本質是相同的,從源碼中可以看出:
getLayoutInflater():
Activity 的 getLayoutInflater() 方法是調用 PhoneWindow 的getLayoutInflater()方法,看一下該源代碼:
1 public PhoneWindow(Context context) {  
2         super(context);  
3         mLayoutInflater = LayoutInflater.from(context);  
 
 }  

可以看出它其實是調用 LayoutInflater.from(context)。
LayoutInflater.from(context):
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;   

可以看出它其實調用 context.getSystemService()。
結論:所以這三種方式最終本質是都是調用的Context.getSystemService()。

inflate 方法
通過 sdk 的 api 文檔,可以知道該方法有以下幾種過載形式,返回值均是 View 對象,如下:
1 public View inflate (int resource, ViewGroup root)  
2 public View inflate (XmlPullParser parser, ViewGroup root)  
3 public View inflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot)  
4 public View inflate (int resource, ViewGroup root, boolean attachToRoot)  

示意代碼:


1 LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);  
2 View view = inflater.inflate(R.layout.custom, (ViewGroup)findViewById(R.id.test));  

3//EditText editText = (EditText)findViewById(R.id.content);// error  

4 EditText editText = (EditText)view.findViewById(R.id.content);  
 


對於上面代碼,指定了第二個參數 ViewGroup root,當然你也可以設置爲 null 值。




注意:


·inflate 方法與 findViewById 方法不同;


·inflater 是用來找 res/layout 下的 xml 佈局文件,並且實例化;


·findViewById() 是找具體 xml 佈局文件中的具體 widget 控件(如:Button、TextView 等)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章