在实际开发会用到LayoutInflater这个类,它的作用类似于 findViewById()。
LayoutInflater是用来找layout下xml布局文件,并且实例化,而findViewById()是找具体xml下的具体 widget控件(如:Button,TextView等)。
对于一个没有被载入或者想要动态加载的界面,都需要使用LayoutInflater.inflate()来载入。

什么叫做动态加载的界面呢?
在应用中有时候需要通过某些点击效果动态地添加布局,而不是直接加载完整的xml布局文件,就需要动态载入。
http://blog.csdn.net/u013227064/article/details/51108732

接下来看一下LayoutInflater的用法。
inflate方法有三个参数(int resource, ViewGroup root, boolean attachToRoot)。
resource:需要加载布局文件的id,意思是需要将这个布局文件中加载到Activity中来操作。

root:需要附加到resource资源文件的根控件,什么意思呢,就是inflate()会返回一个View对象,如果第三个参数attachToRoot为true,就将这个root作为根对象返回,否则仅仅将这个root对象的LayoutParams属性附加到resource对象的根布局对象上,也就是布局文件resource的最外层的View上,比如是一个LinearLayout或者其它的Layout对象。

attachToRoot:是否将root附加到布局文件的根视图上
很难理解的话,我们来看下面一段代码。
我的activity_main布局如下

<?xml versio`这里写代码片`n="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/qwe"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"></LinearLayout>

我还有一个linearlayout如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/asd"android:layout_width="200dp"android:layout_height="200dp"android:background="@color/colorPrimaryDark"android:gravity="center"android:orientation="vertical"><Button
        android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="这是一个按钮"/>
</LinearLayout>

我现在想把这个linearlayout布局添加到我的activity_main中去,可以这么做。

package com.example.inflatertest;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.LinearLayout;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);LinearLayout ll = (LinearLayout) findViewById(R.id.qwe);LayoutInflater inflater = LayoutInflater.from(this);inflater.inflate(R.layout.linearlayout, ll,true);}
}

效果如图

inflate方法返回的是一个view,而我并没有添加这个返回的view就已经将linearlayout添加进来了。因为我的第三个参数设置为true,表示将第一个参数所指定的布局添加到第二个参数的View中。
如果多写那么一行代码。

package com.example.inflatertest;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);LinearLayout ll = (LinearLayout) findViewById(R.id.qwe);LayoutInflater inflater = LayoutInflater.from(this);View view=inflater.inflate(R.layout.linearlayout, ll,true);ll.addView(view);}
}

会抛出如下错误:

原因就是因为当第三个参数为true时,会自动将第一个参数所指定的View添加到第二个参数所指定的View中。

下面我们再来看看当第三个参数attachToRoot为false时的情况。
当attachToRoot为false时,表示不将第一个参数所指定的View添加到第二个参数root中去。因为我们想要添加布局可以把第三个参数设为true,那我们为什么这里要设为false呢?我们在设置控件的时候,都会设置layout_width和layout_height,这两个属性表示的是在容器里的大小,当然也意味着,这两个属性必须要在容器里才有意义,否则没有意义。

这就意味着如果我直接将linearlayout加载进来而不给它指定一个父布局,则inflate布局的根节点的layout_width和layout_height属性将会失效(因为这个时候linearlayout将不处于任何容器中,那么它的根节点的宽高自然会失效)。
如果我想让linearlayout的根节点有效,又不想让其处于某一个容器中,那我就可以设置root不为null,而attachToRoot为false。
还是那两个布局,这次我想添加该怎么办呢?

package com.example.inflatertest;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);LinearLayout ll = (LinearLayout) findViewById(R.id.qwe);LayoutInflater inflater = LayoutInflater.from(this);View view=inflater.inflate(R.layout.linearlayout, ll,false);ll.addView(view);}
}

效果与前面一致。

LayoutInflater类的作用与用法相关推荐

  1. java中PageInfo类的作用及用法

    作用 在我们使用SpringBoot查询数据时,可能会返回多个结果,而前端页面需要分页展示数据,PageInfo这个类帮助我们对数据进行分页,我们只需要传我们需要的页数和总条数即可 用法 首先我们要在 ...

  2. python set类型和set()函数作用、用法等集合,让你学会用set

    本文主要收集整理Python set的类型.作用.用法等知识点的收集整理,Python set是什么意思,看完本文的文章集合基本就会使用Python set了. 1.Python-set() 函数 2 ...

  3. android LayoutInflater.inflate()的参数及其用法

    很多人在网上问LayoutInflater类的用法,以及inflate()方法参数的含义,现解释如下: inflate()的作用就是将一个用xml定义的布局文件查找出来,注意与findViewById ...

  4. PreTranslateMessage作用和用法

    PreTranslateMessage作用和用法 PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗体的消息都要通过这里,比較经常使用,当 ...

  5. PHP中的常见魔术方法功能作用及用法实例

    这篇文章主要介绍了PHP中的常见魔术方法功能作用及用法实例,本文讲解了构造函数和析构函数__construct()和__desctruct()以及属性重载(Property Overloading)_ ...

  6. 、简述global关键字的作用_在C#编程中global关键字的作用及其用法

    在C#编程中,global 是 C# 2.0 中新增的关键字,理论上说,如果代码写得好的话,根本不需要用到它.今天就为大家展示下global关键字的作用及其用法,希望对大家学习C#编程有所帮助. 假设 ...

  7. C#中using关键字的作用及其用法(转)

    C#中using关键字的作用及其用法 using的用途和使用技巧.     using关键字微软MSDN上解释总共有三种用途:     1.引用命名空间.     2.为命名空间或类型创建别名.    ...

  8. OpenCV Mat类详解和用法

    OpenCV Mat类详解和用法 我们有多种方法可以获得从现实世界的数字图像:数码相机.扫描仪.计算机体层摄影或磁共振成像就是其中的几种.在每种情况下我们(人类)看到了什么是图像.但是,转换图像到我们 ...

  9. QT error: LNK2019: 无法解析的外部符号 __imp__SendMessageW@ 类型的错误 以及 pragma comment 的作用(用法)

    使用QT Creator 开发一个通讯项目时候,需要使用windows系统函数,比如: #include <windows.h> #include <WinUser.h> .. ...

  10. @ConditionalOnProperty的作用和用法

    @ConditionalOnProperty的作用和用法 在spring boot中有时候需要控制配置类是否生效,可以使用@ConditionalOnProperty注解来控制@Configurati ...

最新文章

  1. mysql dump 到的文件_mysql查询结果导出到文件
  2. 女朋友为我写了一个防猝死插件...
  3. Windows启动文件的详细介绍
  4. VTK:PolyData之ResampleAppendedPolyData
  5. web系统四层结构中服务器端,基于.NET平台构建四层B/S结构的动态网站
  6. web怎么在圆圈里画半html,在WEB里绘制爱心
  7. 集群服务器分布式iis_使用nginx实现分布式限流的方法
  8. (转)H.264 RTP payload 格式
  9. python信息安全书籍_2018年信息安全从业者书单推荐
  10. 基于Android的虚拟校园移动学习系统
  11. 聊聊JVM——类的加载(一)
  12. 使用Rust开发操作系统(UEFI基本介绍)
  13. 如何修复Kindle频繁自动锁屏和解锁
  14. 光猫 路由器 和交换器
  15. JavaFX实现网络对话程序设计(互联网程序设计课程 第2讲)
  16. 2022-05-19 列式数据库-Clickhouse
  17. Java学习-数据操作高级篇
  18. 一夜之间小米与CDR分道扬镳,背后究竟隐藏了什么?
  19. OFFICE 安装教程
  20. 用友U8销售退货案例教程

热门文章

  1. 天线方向图仿真(面阵、圆阵、圆环阵)matlab
  2. Ansys-结构动力学分析-悬臂梁模态分析学习收获
  3. 2020 的最后 1 天,写个年终总结吧!
  4. Altium Designer 18中查找元器件的四种方法
  5. 软件系统概要设计的三大要素
  6. 浅谈测试小白到测试大牛的成长历程(分四个境界)
  7. 圆运动和椭圆运动公式
  8. Windows下9001端口被占用
  9. 如何用计算机录视频,如何在电脑上录制正在播放的视频?原来方法这么简单
  10. 集成editormd支持markdown语法(一)之基本使用