1. 程式人生 > >獲取LayoutInflater的三種方法

獲取LayoutInflater的三種方法

在實際開發中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 例項的三種方式:

1.LayoutInflater inflater = getLayoutInflater();  //呼叫Activity的getLayoutInflater()

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

3. LayoutInflater inflater = LayoutInflater.from(context);  

 

其實,這三種方式本質是相同的,從原始碼中可以看出:

getLayoutInflater():

Activity 的 getLayoutInflater() 方法是呼叫 PhoneWindow 的getLayoutInflater()方法,看一下該原始碼:

public PhoneWindow(Context context) {         

   super(context);         

   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     
 2     public View inflate (int resource, ViewGroup root);  
 3     public View inflate (XmlPullParser parser, ViewGroup root);
 4     public View inflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot);   
 5     public View inflate (int resource, ViewGroup root, boolean attachToRoot); 
 6 
 7     LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);    
 8     View view = inflater.inflate(R.layout.custom, (ViewGroup)findViewById(R.id.test));    
 9     //EditText editText = (EditText)findViewById(R.id.content);
10     // error 
    EditText editText = (EditText)view.findViewById(R.id.content);
複製程式碼

對於上面程式碼,指定了第二個引數 ViewGroup root,當然你也可以設定為 null 值。

注意:

·inflate方法與 findViewById 方法不同;

·inflater 是用來找 res/layout下的 xml 佈局檔案,並且例項化;

·findViewById() 是找具體 xml 佈局檔案中的具體 widget 控制元件(如:Button、TextView 等)。