LayoutInflater做用是将layout的xml布局文件实例化为View类对象。网络
实现LayoutInflater的实例化共有3种方法,函数
(1).经过SystemService得到布局
LayoutInflater inflater = (LayoutInflater)context.getSystemServices(Context.LAYOUT_INFLATER_SERVICES);spa
View view = inflater.inflate(R.layout.main, null);orm
(2).从给定的context中得到xml
LayoutInflater inflater = LayoutInflater.from(context);对象
View view = inflater.inflate(R.layout.mian, null);资源
(3).get
LayoutInflater inflater =getLayoutInflater();(在Activity中能够使用,其实是View子类下window的一个函数)源码
View layout = inflater.inflate(R.layout.main, null);
其实,这三种方式本质是相同的,从源码中能够看出:
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()。
public View inflate(int Resourece,View Grouproot)
做用:填充一个新的视图层次结构从指定的XML资源文件中
reSource:View的layout的ID
root: 生成的层次结构的根视图
return 填充的层次结构的根视图。若是参数root提供了,那么root就是根视图;不然填充的XML文件的根就是根视图。
其他几个重载的inflate函数相似。
另外补充下,getSystemService是Activity中的方法,根据传入的name来取得对应的服务对象,这些服务名称参数都是Context类中的常量:
传入的Name 返回的对象 说明WINDOW_SERVICE WindowManager 管理打开的窗口程序LAYOUT_INFLATER_SERVICE LayoutInflater 取得xml里定义的viewACTIVITY_SERVICE ActivityManager 管理应用程序的系统状态POWER_SERVICE PowerManger 电源的服务ALARM_SERVICE AlarmManager 闹钟的服务NOTIFICATION_SERVICE NotificationManager 状态栏的服务KEYGUARD_SERVICE KeyguardManager 键盘锁的服务LOCATION_SERVICE LocationManager 位置的服务,如GPSSEARCH_SERVICE SearchManager 搜索的服务VEBRATOR_SERVICE Vebrator 手机震动的服务CONNECTIVITY_SERVICE Connectivity 网络链接的服务WIFI_SERVICE WifiManager Wi-Fi服务TELEPHONY_SERVICE TeleponyManager 电话服务