inflate方法的用法
原文作者: addcn
原文地址: http://my.eoe.cn/addcn/archive/4215.html
Inflate()作用就是将xml定义的一个布局找出来,但仅仅是找出来而且隐藏的,没有找到的同时并显示功能。而setContentView()将布局设置成当前屏幕即Activity的内容,可以直接显示出来。
SetContentView()一旦调用, layout就会立刻显示UI;而inflate只会把Layout形成一个以view类实现成的对象。有需要时再用setContentView(view)显示出来。
注:Inflate()或可理解为“隐性膨胀”,隐性摆放在view里,inflate()前只是获得控件,但没有大小没有在View里占据空间,inflate()后有一定大小,只是出于隐藏状态。
一般在activity中通过setContentView()将界面显示出来,但是如果在非activity中如何对控件布局设置操作了,这需LayoutInflater动态加载。
123456789 10 11 |
<TextViewandroid:id="@+id/tview"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="ATAAW.COM" /><Buttonandroid:id="@+id/button"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="按钮" /> |
在程序中动态加载以上布局。
1 2 |
LayoutInflater flater = LayoutInflater.from(this); View view = flater.inflate(R.layout.example, null); |
获取布局中的控件。
1 2 |
button = (Button) view.findViewById(R.id.button); textView = (TextView)view.findViewById(R.id.tview); |
接下来结合源码说说inflate方法的二种形式:
1.通过 LayoutInflater类的inflate()方法动态加载。两种获得LayoutInflater的方法
a. 通过SystemService获得
1 |
LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLEATER_SERVICE); |
b. 从给定的context中获取
1 |
Public static LayoutInflater from(Context context) |
c. 两者的区别:实际上是一样的,源码
1 2 3 4 5 6 7 8 |
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; } |
d. 实现代码:
第一步,先获得LayoutInflater对象。
1 |
LayoutInflater inflater=context.getSystemService(Context.LAYOUT_INFLEATER_SERVICE); |
第二步,调用inflate()方法加载布局资源。
1 |
View view=inflater.inflate(int resource, ViewGroup root); |
参数1:要加载的xml资源文件,加载出错抛出InflateException异常。
参数2:新生成视图的父层,可设置为NULL。
第三步,将新生成的View加入到需要的View中,我们可以通过findViewById()
方法获取当前Acitivty中的视图MyView,然后把新生成的view加入到Myview中。
1 |
MyView.add(view, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); |
注意:需要指定视图属性。
也可以调用inflater.inflate(int resource, ViewGroup root)方法时直接将视图加入到父视图中。
如:inflater.inflate(R.layout.login,MyView);
这种情况不好控制新视图的长宽。建议使用第一种。
注: LayoutInflater.inflate()将Layout文件转换为View,专门供Layout使用的Inflater。虽然Layout也是 View的子类,但在android中如果想将xml中的Layout转换为View放入.java代码中操作,只能通过Inflater,而不能通过 findViewById()。
第二种方法:使用View的静态方法:
1 |
static View inflate(Context context, int resource, ViewGroup root) |
参数1:Acitivity或Application的上下文
参数2:指定的xml布局文件
参数3:指定父组件。
同样可以通过:
1 |
View view=View.inflate(this,R.layout.*,null); |
生成一个新的View,然后调用Add方法指定View的属性并加入的父组件中。
当然也可以使用View.inflate(this,R.layout.*,MyView)
直接加入到父组件中。
findViewById有两种形式 :
R.layout.xx是引用res/layout/xx.xml的布局文件(inflate 方法),R.id.xx是引用布局文件里面的组件,组件的id是xx(findViewById方法)。所有的组件id都能用R.id.xx来查看,但是 组件不在setContentView()里面的layout中就无法使用,Activity.findViewById()会出现空指针异常
a. activity中的findViewById(int id)
b. View 中的findViewById(int id)
6.不同点是LayoutInflater是用来找layout下xml布局文件,并且实例化!而findViewById()是找具体xml下的具体 widget控件(如:Button,TextView等)。
Android上还有一个与Inflate()类似功能的方法叫findViewById(),二者有时均可使用,但也有区别,
区别在于:
findViewById()只能找出当前布局中的组件,即setConentView()的那个layout里的组件.
如果你的Activity里用到别的layout,比如对话框layout,你还要设置这个layout上的其他组件的内容,你就必须用inflate()方法先将对话框的layout找出来,然后再用findViewById()找到它上面的其它组件。例如:
1 2 3 |
View view1=View.inflate(this,R.layout.dialog_layout,null); TextViewdialogTV=(TextView)view1.findViewById(R.id.dialog_tv); dialogTV.setText("abcd"); |
注:R.id.dialog_tv是在对话框layout上的组件,而这时若直接用this.findViewById(R.id.dialog_tv)肯定会报错。
1 |
View viewStub = ((ViewStub) findViewById(R.id.stubView)).inflate(); |
参考:
http://blog.csdn.net/uyu2yiyi/article/details/6324335
http://www.eaier.net/?p=107
转载:
http://blog.sina.com.cn/s/blog_5da93c8f0100xm6n.html
补充
http://blog.csdn.net/jj120522/article/details/7905122
"我简单解释下:当root为null的时候,我们只是把一个xml文件实例化成View对象,反回的就是xml对应的View.而当root不为null的时候,也就是存在parent.那么我们将把这个xml实例化程View对象后,将这个View视图add进其parent中.所以在这里我们用的是LayoutInflater.from(context).inflate(R.layout.item, this);这样其实就是把XML实例化后当作自己的一部分,这样我们在调用此控件的时候,显示的就是我们想要的那个视图了(XML视图).说到这里大家明白了.这样以后用的时候再也不会糊涂了.如果想详细了解那么请参考这篇文章:View视图框架源码分析之一:android是如何创建一个view.讲解的那是的相当的透彻,看懂后对于以后我们开发是百利而无一害啊.(^__^)"
inflate方法的用法相关推荐
- inflate简介,LayoutInflater和inflate()方法的用法
一.inflate简介 inflate这个方法总共有四种形式(见下面),目的都是把xml表述的layout转化为View对象. 其中有一个比较常用,View inflate(int resource, ...
- Android中inflate方法的用法
Inflate()作用就是将xml定义的一个布局找出来,但仅仅是找出来而且隐藏的,没有找到的同时并显示功能.最近做的一个项目就是这一点让我迷茫了好几天. android上还有一个与Inflate()类 ...
- Android之Inflate()方法用途
flate()作用就是将xml定义的一个布局找出来,但仅仅是找出来而且隐藏的,没有找到的同时并显示功能.最近做的一个项目就是这一点让我迷茫了好几天. Android上还有一个与Inflate()类似功 ...
- Inflate()---Android之Inflate()方法用途
Inflate()作用就是将xml定义的一个布局找出来,但仅仅是找出来而且隐藏的,没有找到的同时并显示功能.最近做的一个项目就是这一点让我迷茫了好几天. android上还有一个与Inflate()类 ...
- inflate方法两个参数和三个参数的区别
前言 今天在lint项目的代码时,又遇到了inflate方法的参数问题,之前看过相关的文章,又没有记录下来,导致时间长了就忘记了.今天再次遇到这个问题,便老老实实记录一下LayouInflater中i ...
- LayoutInflater中inflate()方法的学习使用
LayoutInflater中inflate()方法的学习使用 一.LayoutInflater LayoutInflater实例化一个xml布局加到对应的View对象中.该对象不直接使用.调用g ...
- 直接法 matlab,解线性方程组直接方法matlab用法.doc
解线性方程组直接方法matlab用法 在这章中我们要学习线性方程组的直接法,特别是适合用数学软件在计算机上求解的方法. 2.1 方程组的逆矩阵解法及其MATLAB程序 2.1.3 线性方程组有解的判定 ...
- PHP中魔术方法的用法
PHP中魔术方法的用法 /** PHP把所有以__(两个下划线)开头的类方法当成魔术方法.所以你定义自己的类方法时,不要以 __为前缀. * */// __toString.__set.__get__ ...
- 带你看懂LayoutInflater中inflate方法
关于inflate问题,我想很多人多多少少都了解一点,网上也有很多关于这方面介绍的文章,但是枯燥的理论或者翻译让很多小伙伴看完之后还是一脸懵逼,so,我今天想通过三个案例来让小伙伴彻底的搞清楚这个东东 ...
- android studio 如何提示方法的用法
方法/步骤1在 Eclipse中鼠标放上去就可以提示方法的用法,实际上Android Studio也可以设置的.如图 Preferences > Editor >Generan> S ...
最新文章
- 37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...
- OUYA游戏开发快速入门教程
- 模式识别新研究:微软OCR两层优化提升自然场景下的文字识别精度
- 参数 相等_ANSYS DesignXplorer 参数化优化在水冷板流道设计中的应用
- Spread Studio for .NET 7: 使用现有数据填充单元格
- u-boot Makefile完全解读
- C语言变长数组 struct中char data[0]的用法
- Web 版 VS Code (Visual Studio Online) 即将来临!
- 如何脱离SDK,使用DW5.5和phonegap以及JQMobile搭建开发环境
- 今天的我叫史努比的飞鸽传书
- “反应快”的程序猿更优秀吗?
- [Ruby on Rails系列]3、初试Rails:使用Rails开发第一个Web程序
- 手写哈希(实现简单的加数、查询)
- Oracle Sys和system用户区别
- 竟还有这样的代码注释我笑喷了
- Oracle约束的使用
- html点击图片局部放大,鼠标单击实现放大镜图片局部放大效果
- 树莓派搭建transmission下载机
- 大学综评自招面试 计算机专业,自主招生中的综合评价面试技巧
- python多久可以入门_python自学要多久能学会
热门文章
- 从零学习Belief Propagation算法(三)
- websocket+kafka+springcloud+springboot实现报文(json)传输,解析,推送
- pca降维算法java_PCA降维算法
- windows下安装openssl工具及生成pfx文件
- python实现排序的lowB三人组:冒泡、插入、选择
- Hybrid App开发 四大主流平台
- 【BZOJ5109】【CodePlus2017】大吉大利,晚上吃鸡!
- 电影级视频剪辑PR调色/FCP调色/达芬奇调色预设LUTs
- 宁德时代钠电池雷声大,雨点小?
- 数亿人热血狂欢!EDG含泪加冕,我们是冠军!