天天看點

Android LayoutInflater 詳解Android LayoutInflater 詳解

Android LayoutInflater 詳解

簡介:
在實際開發中

LayoutInflater

這個類還是非常有用的,它的作用類似于

findViewById()

不同點是

LayoutInflater

是用來找

res/layout/

下的

xml

布局檔案,并且執行個體化;而

findViewById()

是找

xml

布局檔案下的具體

widget

控件(如Button,TextView等等)。
使用場景:
①對于一個沒有被載入或者想要動态載入的界面,都需要使用

LayoutInflater.inflater()

來載入。
②對于一個已經載入的界面,可以使用

Activity.findViewById()

方法來擷取其中的界面元素。
擷取

LayoutInflater

執行個體的三種方式:
// 方式1
// 調用Activity的getLayoutInflater()
LayoutInflater inflater = getLayoutInflater();
// 方式2
LayoutInflater inflater = LayoutInflater.from(context);
// 方式3
LayoutInflater inflater = LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
其實,這三種方式本質上是一樣的,從源碼中可以看出:

Activity

getLayoutInflater()

方法調用的是

PhoneWindow

getLayoutInflater()

方法,該方法源碼為:
public PhoneWindow(Context context){   
    super(context);   
    mLayoutInflater = LayoutInflater.from(context);
}
           
可以看出其實調用的是

LayoutInflater.from(context)

,而對于

LayoutInflater.from(context)

而言,它實際調用的是

context.getSystemService()

,請看如下源碼:
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()

這個方法。

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 電話服務

示例代碼如下:

LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);       
View view = inflater.inflate(R.layout.custom, (ViewGroup)findViewById(R.id.test));       
EditText editText = (EditText)view.findViewById(R.id.content);

// 注意:
// ·inflate 方法與 findViewById 方法不同;
// ·inflater 是用來找 res/layout 下的 xml 布局檔案,并且執行個體化;
// ·findViewById() 是找具體 xml 布局檔案中的具體 widget 控件(如:Button、TextView 等)。