LayoutInflater解读

原创 2017年07月17日 20:11:43

LayoutInflater解读

将一个布局XML文件实例化到相应的View对象。它从不直接使用。相反,使用
android.app.Activity#getLayoutInflater() 或Context#getSystemService检索已连接到当前Context对象的标准LayoutInflater实例,并为正在运行的设备正确配置。

获取LayoutInflater实例的方式:

1.使用LayoutInflater类中的inflate(@LayoutRes int resource, @Nullable ViewGroup root),inflater方法还有其他三个重载方法,其中涉及XmlPullParser暂不可使用,详见源码。

LayoutInflater inflater = LayoutInflater.from(this);
View view = inflater.inflate(R.layout.layout_add_dialog, null);

2.在Activity中使用getLayoutInflater()

LayoutInflater inflater=getLayoutInflater(); 

3.系统推荐使用context.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);

LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

LayoutInflater类源码解读:

//两个构造方法

/**
 * 创建一个与特定context关联的新的LayoutInflater实例
 *
 * 应用程序几乎总是希望使用context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 * 
 */
protected LayoutInflater(Context context) {
    mContext = context;
}

/**
 * 创建一个新的LayoutInflater实例,它是现有的一个LayoutInflater的副本,
 * 可以选择它的上下文发生了变化,用于实现cloneInContext
 * 
 * @param original The original LayoutInflater to copy.
 * 
 * @param newContext The new Context to use.
 */
protected LayoutInflater(LayoutInflater original, Context newContext) {
    mContext = newContext;
    mFactory = original.mFactory;
    mFactory2 = original.mFactory2;
    mPrivateFactory = original.mPrivateFactory;
    setFilter(original.mFilter);
}

/**
 * 从给定的上下文获得LayoutInflater对象
 */
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;
}

/**
 * 创建一个现有的LayoutInflater对象的副本,并使用该副本指向一个不同的Context对象。
 * 这是使用ContextThemeWrapper来创建一个新的LayoutInflater,以便与新的上下文主题一起使用。
 */
public abstract LayoutInflater cloneInContext(Context newContext);

//inflate()方法重载

/**
 * Inflate a new view hierarchy from the specified xml resource.
 * Throws InflateException if there is an error.
 * 
 * @param resource ID for an XML layout resource to load (e.g R.layout.main_page)
 * 
 * @param root 可选视图作为生成的层次结构的父类。
 * 
 * @return inflated的层次结构的根视图。如果提供了root值,那么这就是根视图;
 * 否则,它就是inflated的XML文件的root。
 */
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root) {
    return inflate(resource, root, root != null);
}

/**
 * Inflate a new view hierarchy from the specified xml node. 
 * Throws InflateException if there is an error.
 * 
 * 出于性能方面的原因, view inflation严重依赖于在构建时进行的XML文件的预处理。
 * 因此,目前不可能在运行时使用XmlPullParser在一个纯XML文件上使用LayoutInflater。 
 * 
 * @param parser 包含视图层次结构描述的XML dom节点。
 * 
 * @param root 可选,视图作为生成的层次结构的父类。
 * 
 * @return inflated的层次结构的根视图。如果提供了root值,那么这就是根视图;
 * 否则,它就是inflated的XML文件的root。
 */
public View inflate(XmlPullParser parser, @Nullable ViewGroup root) {
    return inflate(parser, root, root != null);
}

/**
 * Inflate a new view hierarchy from the specified xml resource. 
 * Throws InflateException if there is an error.
 * 
 * @param resource ID for an XML layout resource to load (e.g R.layout.main_page)
 * 
 * @param root 可选,如果attachToRoot值为true,视图是生成的层次结构的父类
 * 如果attachToRoot值为false,则是一个为返回的层次结构提供一组LayoutParams值的对象
 * 
 * @param attachToRoot 是否应该将inflated的层次结构附加到根参数上。
 * 如果是false,根只用于为XML中的根视图创建正确的LayoutParams的子类。
 * 
 * @return inflated的层次结构的根视图。如果提供了root,而attachToRoot是正确的,那么这就是根;
 * 否则它就是inflated的XML文件的根。
 */
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot) {
    final Resources res = getContext().getResources();
    if (DEBUG) {
        Log.d(TAG, "INFLATING from resource: \"" + res.getResourceName(resource) + "\" ("
                + Integer.toHexString(resource) + ")");
    }

    final XmlResourceParser parser = res.getLayout(resource);
    try {
        return inflate(parser, root, attachToRoot);
    } finally {
        parser.close();
    }
}

/**
 * Inflate a new view hierarchy from the specified XML node.
 * Throws InflateException if there is an error.
 * 
 * 出于性能方面的原因, view inflation严重依赖于在构建时进行的XML文件的预处理。
 * 因此,目前不可能在运行时使用XmlPullParser在一个纯XML文件上使用LayoutInflater。
 * 
 * @param parser 包含视图层次结构描述的XML dom节点。
 * 
 * @param root 可选,如果attachToRoot值为true,视图是生成的层次结构的父类,
 * 或者只是一个为返回的层次结构提供一组LayoutParams值的对象(如果attachToRoot值为false)。
 * 
 * @param attachToRoot 是否应该将inflated的层次结构附加到根参数上。
 * 如果是false,根只用于为XML中的根视图创建正确的LayoutParams的子类。
 * 
 * @return inflated的层次结构的根视图。如果提供了root,而attachToRoot是正确的,那么这就是根;
 * 否则它就是inflated的XML文件的根。
 */
public View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot) {
    synchronized (mConstructorArgs) {
        Trace.traceBegin(Trace.TRACE_TAG_VIEW, "inflate");

        final Context inflaterContext = mContext;
        final AttributeSet attrs = Xml.asAttributeSet(parser);
        Context lastContext = (Context) mConstructorArgs[0];
        mConstructorArgs[0] = inflaterContext;
        View result = root;
        ...

        return result;
    }
}

Activity中定义了这样的方法

/**
 * Convenience for calling android.view.Window#getLayoutInflater
 */
@NonNull
public LayoutInflater getLayoutInflater() {
    return getWindow().getLayoutInflater();
}

Window类中的有关方法定义

/**
 * 快速访问该窗口从其上下文检索其LayoutInflater实例
 *
 * @return LayoutInflater The shared LayoutInflater.
 */
@NonNull
public abstract LayoutInflater getLayoutInflater();
版权声明:内容为原创,版权所有,转载请注明原文地址 http://blog.csdn.net/sinat_34383316

LayoutInflater的正确用法

Layout inflation是在android系统中使用的术语,当XML布局资源被解析并转换成View对象时会用到。 在Android SDK中,LayoutInflater是经常使用到的,但你...
  • u010429311
  • u010429311
  • 2016年04月03日 16:46
  • 1413

学习Android遇到的问题——LayoutInflater

前言对于像我这样的android初学者来说,LayoutInflater是个很模糊的概念,I can’t feel it!我只知道在自定义控件的时候构造函数中会用到LayoutInflater.fro...
  • small_bo
  • small_bo
  • 2015年11月24日 18:12
  • 413

Android开发——深入理解LayoutInflater

LayoutInflater类可以从XML文件中实例化View对象,其中涉及到XML解析,使用的是PULL解析;从标签实例化View,使用的是反射。 如何获取LayoutInflater?为了获取L...
  • qq_19431333
  • qq_19431333
  • 2016年11月01日 10:28
  • 911

android LayoutInflater加载的布局大小不受控制

在使用LayoutInflater 加载布局时,经常会碰到这样的情况,明明在布局里设置了布局的大小,为什么就是不起作用,但是同样的布局 在setContentView() 中就可以起作用呢!在查看底层...
  • hushaoxi
  • hushaoxi
  • 2016年08月16日 17:09
  • 944

LayoutInflater如何加载布局?

对于有一定Android开发经验的同学来说,一定使用过LayoutInflater.inflater()来加载布局文件,但并不一定去深究过它的原理,比如 1.LayoutInflater为什么可以加载...
  • javine
  • javine
  • 2016年11月22日 14:29
  • 650

Android LayoutInflater原理分析,带你一步步深入了解View(一)

有不少朋友跟我反应,都希望我可以写一篇关于View的文章,讲一讲View的工作原理以及自定义View的方法。没错,承诺过的文章我是一定要兑现的,而且在View这个话题上我还准备多写几篇,尽量能将这个知...
  • sinyu890807
  • sinyu890807
  • 2013年12月19日 08:34
  • 251472

动态设置布局LayoutInflater

动态设置布局LayoutInflater
  • menglele1314
  • menglele1314
  • 2015年06月09日 08:55
  • 901

android View的布局宽高之LayoutInflater函数详解

  • cauchyweierstrass
  • cauchyweierstrass
  • 2014年11月20日 18:19
  • 6483

Android 源码系列之<四>从源码的角度深入理解LayoutInflater.Factory之主题切换(上)

现在越来越多的APP都加入了换肤功能或者是日间模式和夜间模式等,这些功能不仅增加了用户体验也增强了用户好感,众所周知QQ和网易新闻的APP做的用户体验都非常好,它们都有日间模式和夜间模式的主题切换。实...
  • llew2011
  • llew2011
  • 2016年05月04日 18:16
  • 6702

layoutInflater动态加载布局

activity_main.xml
  • u013210620
  • u013210620
  • 2015年12月18日 21:14
  • 1190
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LayoutInflater解读
举报原因:
原因补充:

(最多只允许输入30个字)