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 實例的三種方式

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 
3         super(context);  
4 
5         mLayoutInflater = LayoutInflater.from(context);  
6 
7 }  

 

可以看出它其實是調用 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 
3 public View inflate (XmlPullParser parser, ViewGroup root)  
4 
5 public View inflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot)  
6 
7 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 
4 //EditText editText = (EditText)findViewById(R.id.content);// error  
5 
6 EditText editText = (EditText)view.findViewById(R.id.content);  

 

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


注意:

·inflate 方法與 findViewById 方法不同;

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

·findViewById() 是找具體 xml 布局文件中的具體 widget 控件(如:Button、TextView 等)。

 

轉自 http://blog.sina.com.cn/s/blog_48a45b950100u8ax.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM