在實際開發中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 對象,如下:
- public View inflate (int resource, ViewGroup root)
- public View inflate (XmlPullParser parser, ViewGroup root)
- public View inflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot)
- 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 等)。