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. supervisor进程管理

    install :  apt-get install supervisor crete  a  xxxx.conf  file at   /etc/supervisor/conf.d the cont ...

  3. 最近Get到的一些HTML/CSS中的小点(一)

    1.<em>和<strong>标签都是用来强调一段话中的某几个文字.<em>默认斜体,<strong>默认粗体.在强调语气上<strong> ...

  4. JS获取终端屏幕、浏览窗口的相关信息

    查看终端屏幕相关信息,在windows系统的控制面板可以查到分辨率且可以设置,更具体的浏览器可视窗口等信息则需要借助其他工具.而在程序里需要动态获取时该怎么做呢? 琢磨的一个js方法,供大家参考.如下 ...

  5. LightOJ_1248 Dice (III)

    题目链接 题意: 给一个质地均匀的n的骰子, 求投掷出所有点数至少一次的期望次数. 思路: 这就是一个经典的邮票收集问题(Coupon Collector Problem). 投掷出第一个未出现的点数 ...

  6. 高性能页面加载技术(流水线加载)BigPipe的C#简单实现(附源码)

    一,BigPipe简介 BigPipe是一个重新设计的基础动态网页服务体系.大体思路是,分解网页成叫做Pagelets的小块,然后通过Web服务器和浏览器建立管道并管理他们在不同阶段的运行.这是类似于 ...

  7. python中使用kazoo连接zookeeper(一)

    http://hi.baidu.com/eldersun/item/b9266e019da769f0f45ba6a4 python下连接zookeeper使用最多的是python 包装的zookeep ...

  8. iOS图案锁,支持动画、图片、绘图

    最近忙着搭建一个聊天用的框架,过几天应该会整理写出来吧,原理不难,但是实现后会省很多事.好久没写博客,周末心血来潮写了个图案锁,这东西没什么技术含量,网上一堆,这次这个图案锁顺便联系了怎么打包使用.a ...

  9. Android 通过开源框架AsyncHttpClient进行get和post请求

    使用时无需将这些代码放入子线程去执行,因为其内部已经封装到一个线程中运行了! public void asyncHttpClientGet(View view) { AsyncHttpClient c ...

  10. 【BZOJ1030】[JSOI2007]文本生成器

    [题意] 给定一些单词,我们定义一篇可读文章至少包含一个这样的单词,求长度为M的可读文章总数. [分析] 用前几题的方法可以求长度为M的不可读的文章总数Sum,所以我们可以用26^M-Sum来求出可读 ...