LayoutInflater作用是将layout的xml布局文件实例化为View类对象。LayoutInflater 的作用类似于 findViewById(),不同点是LayoutInflater是用来找layout目录下的xml布局文件。而且实例化!而 findViewById()是找详细某一个xml下的详细 widget控件(如:Button,TextView等)。

获得 LayoutInflater 实例的三种方式、

1.LayoutInflater inflater = getLayoutInflater(); //调用Activity的getLayoutInflater()

2.LayoutInflater inflater = LayoutInflater.from(this);

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

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()。

结论:所以这三种方式终于本质是都是调用的Context.getSystemService()。

实例化LayoutInflater之后,就要将layout的xml布局文件实例化为View类对象。

1.LayoutInflater inflater = getLayoutInflater(); View view=inflater.inflate(R.layout.ID, null);

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

3.LayoutInflater inflater = (LayoutInflater)Context.getSystemService(LAYOUT_INFLATER_SERVICE); View view=inflater.inflate(R.layout.ID, null);

inflate 方法

通过 sdk 的 api 文档。能够知道该方法有下面几种过载形式,返回值均是 View 对象,例如以下:

public View inflate (int resource, ViewGroup root) (经常使用) inflate()方法一般接收两个參数,第一个參数就是要载入的布局id,第二个參数是指给该布局的外部再嵌套一层父布局,假设不须要就直接传null。这样就成功成功创建了一个布局的实例,之后再将它加入到指定的位置就能够显示出来了。

public View inflate (XmlPullParser parser, ViewGroup root) public View inflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot) public View inflate (int resource, ViewGroup root, boolean attachToRoot)


LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);


View view = inflater.inflate(R.layout.custom, (ViewGroup)findViewById(R.id.test));   

//EditText editText = (EditText)findViewById(R.id.content);

// error EditText editText = (EditText)view.findViewById(R.id.content);

对于上面代码。指定了第二个參数 ViewGroup root。当然你也能够设置为 null 值。

Demo:

以下我们就通过一个很easy的小样例,来更加直观地看一下LayoutInflater的使用方法。

比方说当前有一个项目。当中MainActivity相应的布局文件叫做activity_main.xml,代码例如以下所看到的:

1.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2.android:id="@+id/main_layout"
3.android:layout_width="match_parent"
4.android:layout_height="match_parent"
>
5. 
6.</LinearLayout>

这个布局文件的内容很easy。仅仅有一个空的LinearLayout,里面什么控件都没有,因此界面上应该不会显示不论什么东西。

那么接下来我们再定义一个布局文件,给它取名为button_layout.xml,代码例如以下所看到的:

2.android:layout_width="wrap_content"
3.android:layout_height="wrap_content"
4.android:text="Button"
>
5. 
6.</Button>

这个布局文件也很easy。仅仅有一个Buttonbutton而已。

如今我们要想办法,怎样通过LayoutInflater来将button_layout这个布局加入到主布局文件的LinearLayout中。

依据刚刚介绍的使用方法,改动MainActivity中的代码。例如以下所看到的:

01.public
class MainActivity extends
Activity {
02. 
03.private
LinearLayout mainLayout;
04. 
05.@Override
06.protected
void onCreate(Bundle savedInstanceState) {
07.super.onCreate(savedInstanceState);
08.setContentView(R.layout.activity_main);
09.mainLayout = (LinearLayout) findViewById(R.id.main_layout);
10.LayoutInflater layoutInflater = LayoutInflater.from(this);
11.View buttonLayout = layoutInflater.inflate(R.layout.button_layout,
null);
12.mainLayout.addView(buttonLayout);
13.}
14. 
15.}

能够看到。这里先是获取到了LayoutInflater的实例。然后调用它的inflate()方法来载入button_layout这个布局,最后调用LinearLayout的addView()方法将它加入到LinearLayout中。

如今能够执行一下程序,结果例如以下图所看到的:

Button 在界面上显示出来了!

说明我们确实是借助LayoutInflater成功将button_layout这个布局加入到LinearLayout中了。 LayoutInflater技术广泛应用于须要动态加入View的时候,比方在ScrollView和ListView中。常常都能够看到 LayoutInflater的身影。

动态设置布局LayoutInflater的更多相关文章

  1. Android 动态改变布局属性RelativeLayout.LayoutParams.addRule()

    我们知道,在 RelativeLayout 布局中有很多特殊的属性,通常在载入布局之前,在相关的xml文件中进行静态设置即可. 但是,在有些情况下,我们需要动态设置布局的属性,在不同的条件下设置不同的 ...

  2. 代码中动态改变布局属性RelativeLayout.LayoutParams.addRule()

    我们知道,在 RelativeLayout 布局中有很多特殊的属性,通常在载入布局之前,在相关的xml文件中进行静态设置即可. 但是,在有些情况下,我们需要动态设置布局的属性,在不同的条件下设置不同的 ...

  3. 动态设置 view 在布局中位置

    一.概述 有时项目需要动态设置一个 底部列表,比如 popupwindow ,listview 底部显示 ,所以记录一下 此处, android.support.v7.widget.CardView ...

  4. Android 通过Java代码生成创建界面。动态生成View,动态设置View属性。addRules详解

    废话不多说,本文将会层层深入给大家讲解如何动态的生成一个完整的界面. 本文内容: Java代码中动态生成View Java代码中动态设置View的位置,以及其他的属性 LayoutParams详解 一 ...

  5. android实现界面左右滑动(GridView动态设置item,支持每个item按某个属性排序来显示在不同的界面)

    效果图 :                         分别是第一页.第二页.第三页,随手截的图,不整齐,勿见怪.开始走了弯路,废了不少时间. 思路如下: 1.用ViewPager实现左右分页滑动 ...

  6. 怎样实现动态加入布局文件(避免 The specified child already has a parent的问题)

    首先扯点别的:我应经连续上了两个星期的班了,今天星期一.是第三个周.这个班上的也是没谁了.近期老是腰疼. 预计是累了.近期也没跑步.今天下班继续跑起. 这篇文章讲一讲怎样在一个布局文件里动态加在一个布 ...

  7. 【Android疑难杂症】GridView动态设置Item的宽高导致第一个Item不响应或显示不正常的问题

    前言 这个问题在之前做一个盒子项目时遇到过,最近又遇到了,使用GridView遇到的非常奇葩的问题,这里记录分享一下. 声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnb ...

  8. 实现ScrollView中包含ListView,动态设置ListView的高度

    ScrollView 中包含 ListView 的问题 : ScrollView和ListView会冲突,会导致ListView显示不全 <?xml version="1.0" ...

  9. Android textView 动态设置代码字号大小,支持单位选项 dp,sp or px

    setTextSize(TypedValue.COMPLEX_UNIT_PX,22); //22像素 setTextSize(TypedValue.COMPLEX_UNIT_SP,22); //22S ...

随机推荐

  1. Smarty实现HTML静态化页面

    <?phprequire_once("./config/config.php"); ob_start();$id=$_GET[id];$sql="select * ...

  2. 2016030202 - github中sshkey信息设置

    根据github上面的提示生成ssh秘钥步骤 参考url:https://help.github.com/articles/generating-an-ssh-key/ 1.生成sshkey之前,检查 ...

  3. linux创建交换分区

    一.SWAP 概述 当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用.那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到S ...

  4. VS中无法加入断点进行调试解决方案

    原文地址:http://blog.csdn.net/gukesdo/article/details/6535054 [ 1] 以前也遇到过同样的问题,但没有问个为什么,也没有探个毕竟.昨天调试一个DL ...

  5. struts2 拦截器1

    action invoke前会调用,invoke后会调用 public class FirstInterceptor extends AbstractInterceptor{ @Override pu ...

  6. JQUERY 插件开发——LAZYLOADIMG(预加载和延迟加载图片)

    开发背景 本插件开发是近期写的最后一个插件了,接下来我想把最近研究的redis最为一个系列阐述下.当然Jquery插件开发是我个人爱好,我不会停止,在将来的开发中我会继续完善,当然也会坚持写这个系列的 ...

  7. 精心挑选的12款优秀 jQuery Ajax 分页插件和教程

    在这篇文章中,我为大家收集了12个基于 jQuery 框架的 Ajax 分页插件,这些插件都提供了详细的使用教程和演示.Ajax 技术的出现使得 Web 项目的用户体验有了极大的提高,如今借助优秀的  ...

  8. win7+ubuntu双系统安装方法

    转自win7+ubuntu双系统安装方法 前段时间又安装一下win7+ubuntu双系统,过段时间就会忘记,这次自己写下来,以便以后查看. 1.      先准备一个分区来安装ubuntu.在win7 ...

  9. 【HDOJ】1466 计算直线的交点数

    找了个规律. #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 21 ...

  10. 嵌入式系统烧写uboot/bootloader/kernel的一般方法

    嵌入式系统烧写uboot/bootloader/kernel的一般方法   本文介绍了在嵌入式系统中烧写uboot/bootloader/kernel 的一般方法,以及如果uboot或者内核出现错误, ...