在實(shí)際開發(fā)中LayoutInflater這個(gè)類還是非常有用的,它的作用類似于findViewById()。不同點(diǎn)是LayoutInflater是用來找res/layout/下的xml布局文件,并且實(shí)例化;而findViewById()是找xml布局文件下的具體widget控件(如Button、TextView等)。
具體作用:
1、對(duì)于一個(gè)沒有被載入或者想要?jiǎng)討B(tài)載入的界面,都需要使用LayoutInflater.inflate()來載入;
2、對(duì)于一個(gè)已經(jīng)載入的界面,就可以使用Activiyt.findViewById()方法來獲得其中的界面元素。
LayoutInflater 是一個(gè)抽象類,在文檔中如下聲明:
public abstract class LayoutInflater extends Object
獲得 LayoutInflater 實(shí)例的三種方式
- LayoutInflater inflater = getLayoutInflater();//調(diào)用Activity的getLayoutInflater()
- LayoutInflater inflater = LayoutInflater.from(context);
- LayoutInflater inflater = (LayoutInflater)context.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
其實(shí),這三種方式本質(zhì)是相同的,從源碼中可以看出:
getLayoutInflater():
Activity 的 getLayoutInflater() 方法是調(diào)用 PhoneWindow 的getLayoutInflater()方法,看一下該源代碼:
public PhoneWindow(Context context)
{
super(context);
mLayoutInflater = LayoutInflater.from(context);
}
可以看出它其實(shí)是調(diào)用 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;
}
可以看出它其實(shí)調(diào)用 context.getSystemService()。
結(jié)論:所以這三種方式最終本質(zhì)是都是調(diào)用的Context.getSystemService()。
另外getSystemService()是Android很重要的一個(gè)API,它是Activity的一個(gè)方法,根據(jù)傳入的NAME來取得對(duì)應(yīng)的Object,然后轉(zhuǎn)換成相應(yīng)的服務(wù)對(duì)象。以下介紹系統(tǒng)相應(yīng)的服務(wù)。
傳入的Name 返回的對(duì)象 說明
WINDOW_SERVICE WindowManager 管理打開的窗口程序
LAYOUT_INFLATER_SERVICE LayoutInflater 取得xml里定義的view
ACTIVITY_SERVICE ActivityManager 管理應(yīng)用程序的系統(tǒng)狀態(tài)
POWER_SERVICE PowerManger 電源的服務(wù)
ALARM_SERVICE AlarmManager 鬧鐘的服務(wù)
NOTIFICATION_SERVICE NotificationManager 狀態(tài)欄的服務(wù)
KEYGUARD_SERVICE KeyguardManager 鍵盤鎖的服務(wù)
LOCATION_SERVICE LocationManager 位置的服務(wù),如GPS
SEARCH_SERVICE SearchManager 搜索的服務(wù)
VEBRATOR_SERVICE Vebrator 手機(jī)震動(dòng)的服務(wù)
CONNECTIVITY_SERVICE Connectivity 網(wǎng)絡(luò)連接的服務(wù)
WIFI_SERVICE WifiManager Wi-Fi服務(wù)
TELEPHONY_SERVICE TeleponyManager 電話服務(wù)
inflate 方法
通過 sdk 的 api 文檔,可以知道該方法有以下幾種過載形式,返回值均是 View 對(duì)象,如下:
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);
對(duì)于上面代碼,指定了第二個(gè)參數(shù) ViewGroup root,當(dāng)然你也可以設(shè)置為 null 值。
注意:
·inflate 方法與 findViewById 方法不同;
·inflater 是用來找 res/layout 下的 xml 布局文件,并且實(shí)例化;
·findViewById() 是找具體 xml 布局文件中的具體 widget 控件(如:Button、TextView 等)。