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. JavaScript学习心得(一)

    一Javascript简介 JavaScript是一种面向对象.弱类型的脚本语言!面向对象编程语言(OOP)意味着你用的几乎所有变量都是对象,对象是一种特殊的变量类型,有自己的子变量(称为属性)及函数 ...

  2. __unset()魔术方法 删除类内私有属性

    __unset()魔术方法 删除私有属性 unset()对共有属性进行删除 可通过__unset()魔术方法对私有属性进行操作 当在类外部执行unset()函数时,自动执行类内__unset()魔术方 ...

  3. #Leet Code# Unique Tree

    语言:Python 描述:使用递归实现 class Solution: # @return an integer def numTrees(self, n): : elif n == : else: ...

  4. str、__str__ 、repr、 __repr__、``

    内建函数str()和repr() 或反引号操作符(``)可以方便地以字符串的方式获取对象的内容.类型.数值属性等信息. str()函数得到的字符串可读性好(故被print调用),而结果通常无法用eva ...

  5. General Purpose Hash Function Algorithms

    General Purpose Hash Function Algorithms post@: http://www.partow.net/programming/hashfunctions/inde ...

  6. C#让程序自动在管理员权限下运行

    windows 7和vista提高的系统的安全性,同时需要明确指定“以管理员身份运行”才可赋予被运行软件比较高级的权限,比如访问注册表等.否则,当以普通身份运行的程序需要访问较高级的系统资源时,将会抛 ...

  7. ARC - MRC

    1. 选择工程 ---> build phases  --> .m中添加 -fno-objc-arc

  8. 字符串搜索算法Boyer-Moore

    整理日: 2015年2月16日 1. 主要特征 假设文本串text长度为n,模式串pattern长度为m,BM算法的主要特征为: 从右往左进行比较匹配(一般的字符串搜索算法如KMP都是从从左往右进行匹 ...

  9. 对话机器学习大神Yoshua Bengio(下)

    对话机器学习大神Yoshua Bengio(下) Yoshua Bengio教授(个人主页)是机器学习大神之一,尤其是在深度学习这个领域.他连同Geoff Hinton老先生以及 Yann LeCun ...

  10. Java随机数

    本章先讲解Java随机数的几种产生方式,然后通过示例对其进行演示. 广义上讲,Java中的随机数的有三种产生方式:(01). 通过System.currentTimeMillis()来获取一个当前时间 ...