Android LayoutInflater详解

在实际开发中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 1. LayoutInflater inflater = getLayoutInflater();//调用Activity的getLayoutInflater() 
2 2. LayoutInflater inflater = LayoutInflater.from(context);  
3 3. LayoutInflater inflater =  (LayoutInflater)context.getSystemService
4                               (Context.LAYOUT_INFLATER_SERVICE);

其实,这三种方式本质是相同的,从源码中可以看出: getLayoutInflater(): Activity 的 getLayoutInflater() 方法是调用 PhoneWindow 的getLayoutInflater()方法,看一下该源代码:

1 public PhoneWindow(Context context)
2 {   
3  super(context);   
4     mLayoutInflater = LayoutInflater.from(context);
5 }

可以看出它其实是调用 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 对象,如下:

1 public View inflate (int resource, ViewGroup root) 
2 public View inflate (XmlPullParser parser, ViewGroup root)
3 public View inflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot)  
4 public View inflate (int resource, ViewGroup root, boolean attachToRoot)

示意代码:

1 LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);       
2 View view = inflater.inflate(R.layout.custom, (ViewGroup)findViewById(R.id.test));       
3 //EditText editText = (EditText)findViewById(R.id.content);// error 
4 EditText editText = (EditText)view.findViewById(R.id.content);

对于上面代码,指定了第二个参数 ViewGroup root,当然你也可以设置为 null 值。

注意: ·inflate 方法与 findViewById 方法不同; ·inflater 是用来找 res/layout 下的 xml 布局文件,并且实例化; ·findViewById() 是找具体 xml 布局文件中的具体 widget 控件(如:Button、TextView 等)。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android开发与分享

【Android】ButterKnife 8.x详解

51710
来自专栏青蛙要fly的专栏

关于Fragment的动态添加的相关疑问及解答

今天在网上看到了一个开源库:Spruce Android Animation Library (and iOS)

882
来自专栏Android中高级开发

Android开发之漫漫长途 XII——Fragment详解

该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索...

961
来自专栏Android知识点总结

4-AVI--Fragment与ViewPager结合

1183
来自专栏蜉蝣禅修之道

Android之共享已安装的apk应用

7365
来自专栏10km的专栏

jface databinding:使用CheckboxTableViewer实现表中(Set)对象与CheckTable中选中条目数据绑定

上一篇博文《jface databinding:可多选的widget List组件selection项目与java.util.List对象的双向数据绑定》讲述了...

41410
来自专栏Java后端生活

购物APP项目开发(1)——菜单开发

1554
来自专栏Android干货

Android项目实战(十六):QQ空间实现(一)—— 展示说说中的评论内容并有相应点击事件

6286
来自专栏木头编程 - moTzxx

安卓 —— 图灵机器人+讯飞语音设计实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

2882
来自专栏cloudskyme

android使用Activity

第一个例子,显示网址 首先创建工程 ? 按照提示填入 我使用的是2.3版本,所以Min SDK Version填10 修改/res/layout/下main....

3923

扫码关注云+社区

领取腾讯云代金券