Android LayoutInflater 詳解
- 簡介:
- 在實際開發中
這個類還是非常有用的,它的作用類似于LayoutInflater
。findViewById()
- 不同點是
是用來找LayoutInflater
下的res/layout/
布局檔案,并且執行個體化;而xml
是找findViewById()
布局檔案下的具體xml
控件(如Button,TextView等等)。widget
使用場景: - ①對于一個沒有被載入或者想要動态載入的界面,都需要使用
來載入。LayoutInflater.inflater()
- ②對于一個已經載入的界面,可以使用
方法來擷取其中的界面元素。Activity.findViewById()
擷取 - // 方式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()
LayoutInflater
執行個體的三種方式: 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 等)。