Android LayoutInflater 使用详解 View.inflate 的加载原理

Posted 早起的年轻人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android LayoutInflater 使用详解 View.inflate 的加载原理相关的知识,希望对你有一定的参考价值。

志在巅峰的攀登者,不会陶醉在沿途的某个脚印之中,在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天、每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不妨来瞅瞅码农的轨迹。

如果你有兴趣 你可以关注一下公众号 biglead 来获取最新的学习资料。

LayoutInflater 是用来将 layout.xml 布局文件添加到指定 View 中,或者是将 layout.xml 布局文件转化为对应的 View 对象。


1 LayoutInflater 的获取方式

第一种方式: 从给定的上 Context 下文中获取LayoutInflater:

LayoutInflater  inflater = LayoutInflater.from(context);

或者是

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

第二种方式:在Activity中直接获取LayoutInflater:

LayoutInflater inflater = getLayoutInflater();

从源码分析的角度,无论哪种方式,最终都是使用的 context.getSystemService 这种方式。

2 获取View

2.1 View.inflate

我们通常会将 layout 布局文件加载成View , 会这样来写

 /**
  * 将 Layout 文件 加载 View
  * 参数一 上下文对象
  * 参数二 布局文件 ID
  * 参数三 不为null 时自动将这个布局文件 加载到这个 root 中去  null 代表不添加
  */
View inflate = View.inflate(mContext, R.layout.activity_list1_item, null);

它调用的源码如下


    /**
     * Inflate a view from an XML resource.  This convenience method wraps the {@link
     * LayoutInflater} class, which provides a full range of options for view inflation.
     *
     * @param context The Context object for your activity or application.
     * @param resource The resource ID to inflate
     * @param root A view group that will be the parent.  Used to properly inflate the
     * layout_* parameters.
     * @see LayoutInflater
     */
    public static View inflate(Context context, @LayoutRes int resource, ViewGroup root) {
        LayoutInflater factory = LayoutInflater.from(context);
        return factory.inflate(resource, root);
    }

所以它实际上还是调用的 LayoutInflater.inflate 方法实现的加载。

2.2 LayoutInflater.inflate

/**
   *  参数一 上下文对象
   */
  LayoutInflater layoutInflater = LayoutInflater.from(mContext);
  /**
   * 将 Layout 文件 加载 View
   * 参数一 布局文件 ID
   * 参数二 不为null 时 会测量这个 parent 的大小来 作为 inflate 的父组件大小参考
   * 参数三 true 将加载的 layout 布局文件 自动添加到 parent 中去
   */
  View inflate = layoutInflater.inflate(R.layout.activity_list1_item, parent,false);

以上是关于Android LayoutInflater 使用详解 View.inflate 的加载原理的主要内容,如果未能解决你的问题,请参考以下文章

Android一步步深入理解View:LayoutInflater的使用和原理分析

Android LayoutInflater详解

为啥使用 LayoutInflater 与 xml 不同?

转载《Android LayoutInflater详解》

Android LayoutInflater.inflate的使用及源码分析

android中LayoutInflater的3种使用以及getSystemService的API