[編輯]Android LayoutInflater

來源:互聯網
上載者:User

在實際開發中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 inflater = LayoutInflater.from(context);   

3. LayoutInflater inflater =  (LayoutInflater)context.getSystemService

                                                 (Context.LAYOUT_INFLATER_SERVICE);


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

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()。


另外getSystemService()是Android很重要的一個API,它是Activity的一個方法,根據傳入的NAME來取得對應的Object,然後轉換成相應的服務物件。以下介紹系統相應的服務。

傳入的Name 返回的對象 說明
WINDOW_SERVICE WindowManager 管理開啟的視窗程序
LAYOUT_INFLATER_SERVICE LayoutInflater 取得xml裡定義的view
ACTIVITY_SERVICE ActivityManager 管理應用程式的系統狀態
POWER_SERVICE PowerManger 電源的服務
ALARM_SERVICE AlarmManager 鬧鐘的服務
NOTIFICATION_SERVICE NotificationManager 狀態列的服務
KEYGUARD_SERVICE KeyguardManager 鍵盤鎖的服務
LOCATION_SERVICE LocationManager 位置的服務,如GPS
SEARCH_SERVICE SearchManager 搜尋的服務
VEBRATOR_SERVICE Vebrator 手機震動的服務
CONNECTIVITY_SERVICE Connectivity 網路連接的服務
WIFI_SERVICE WifiManager Wi-Fi服務
TELEPHONY_SERVICE TeleponyManager 電話語音

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)  

示意代碼:

LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);  

View view = inflater.inflate(R.layout.custom, (ViewGroup)findViewById(R.id.test));

//EditText editText = (EditText)findViewById(R.id.content);// error
EditText editText = (EditText)view.findViewById(R.id.content);
對於上面代碼,指定了第二個參數 ViewGroup root,當然你也可以設定為 null 值。


注意:

·inflate 方法與 findViewById 方法不同;

·inflater 是用來找 res/layout 下的 xml 布局檔案,並且執行個體化;

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.