LayoutInflater

转载 2012年03月21日 12:03:07
 

Android - LayoutInflater

 

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

2、对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。

LayoutInflater 是一个抽象类,在文档中如下声明:

Java代码 复制代码 收藏代码
  1. public abstract class LayoutInflater extends Object    

 获得 LayoutInflater 实例的三种方式:

Java代码 复制代码 收藏代码
  1. 1. LayoutInflater inflater = getLayoutInflater();  //调用Activity的getLayoutInflater()   
  2.   
  3. 2. LayoutInflater localinflater =  (LayoutInflater)context.getSystemService   
  4.   
  5.                                                  (Context.LAYOUT_INFLATER_SERVICE);   
  6.   
  7. 3. LayoutInflater inflater = LayoutInflater.from(context);      
  8.   
  9.    

 其实,这三种方式本质是相同的,从源码中可以看出:

getLayoutInflater():

Activity 的 getLayoutInflater() 方法是调用 PhoneWindow 的getLayoutInflater()方法,看一下该源代码:

Java代码 复制代码 收藏代码
  1. public PhoneWindow(Context context) {     
  2.         super(context);     
  3.         mLayoutInflater = LayoutInflater.from(context);     
  4. }    

 可以看出它其实是调用 LayoutInflater.from(context)。

LayoutInflater.from(context):

Java代码 复制代码 收藏代码
  1. public static LayoutInflater from(Context context) {      
  2.     LayoutInflater LayoutInflater =      
  3.             (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);      
  4.     if (LayoutInflater == null) {      
  5.         throw new AssertionError("LayoutInflater not found.");      
  6.     }      
  7.     return LayoutInflater;      
  8. }   

 

可以看出它其实调用 context.getSystemService()。

 

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

 

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

Java代码 复制代码 收藏代码
  1. public View inflate (int resource, ViewGroup root)     
  2. public View inflate (XmlPullParser parser, ViewGroup root)     
  3.      
  4. public View inflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot)     
  5.      
  6. public View inflate (int resource, ViewGroup root, boolean attachToRoot)   

 1:

  public View inflate (int resource, ViewGroup root)
  reSource:View的layout的ID
  root:如果为null,则将此View作为根,此时既可以应用此View中的其他控件了。
          如果!null,  则将默认的layout作为View的根。

 2:

  public View inflate ( XmlPullParser parser, ViewGroup root)
   parser:你需要解析xml的解析接口
   root:如果null,则将此View作为根,此时既可以应用此View中的其他控件了。
          如果!null, 则将默认的layout作为View的根。

 3:

  public View inflate ( XmlPullParser parser, ViewGroup root, boolean attachToRoot)
   parser:你需要解析View的xml的解析接口
   root:如果null,则将此View作为根,此时既可以应用此View中的其他控件了。
          如果!null, 则将默认的layout作为View的根。
   attachToRoot:
   ture:也就将此解析的xml作为View根
   fase:则为默认的xml,做为根视图View

 4:

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

  resource:View的layout的ID

  root:如果null,则将此View作为根,此时既可以应用此View中的其他控件了。

           如果!null, 则将默认的layout作为View的根。

  attachToRoot:

  ture:也就将此解析的xml作为View根
  fase:则为默认的xml,做为根视图View

 

示意代码:

Java代码 复制代码 收藏代码
  1. LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);     
  2.      
  3. View view = inflater.inflate(R.layout.custom, (ViewGroup)findViewById(R.id.test));     
  4.      
  5. //EditText editText = (EditText)findViewById(R.id.content);// error     
  6. EditText editText = (EditText)view.findViewById(R.id.content);   

 同时在此讲讲让我去API中去理解这四个函数的原因吧!嘿嘿!你肯定又会多学一招!
在Activity中:
大家是否知道,在setContentView(new MySurfaceView(this))后,此Activity中声明的View控件,
如:TextView 为什么引用不到layout布局文件中的控件ID呢!初一看能够应用到,但是为什么编译就报空指针呢!原因:在setContentView(new MySurfaceView(this))后,此时的View变为了根视图了,虽然能应用到TextView对应的ID,但是我在 MySurfaceView中根本就没有这个对象,所以就报空指针咯!解决办法:
View view = LayoutInflater.from(this).inflate(R.layout.passover, null);注:每解析一次都会产生不同的对象
然后你再引用没问题,使用自如了。

Android 源码系列之<四>从源码的角度深入理解LayoutInflater.Factory之主题切换(上)

现在越来越多的APP都加入了换肤功能或者是日间模式和夜间模式等,这些功能不仅增加了用户体验也增强了用户好感,众所周知QQ和网易新闻的APP做的用户体验都非常好,它们都有日间模式和夜间模式的主题切换。实...
  • llew2011
  • llew2011
  • 2016年05月04日 18:16
  • 6901

使用LayoutInflater的理解

android
  • A189lin
  • A189lin
  • 2016年05月20日 19:21
  • 551

LayoutInflater的正确用法

Layout inflation是在android系统中使用的术语,当XML布局资源被解析并转换成View对象时会用到。 在Android SDK中,LayoutInflater是经常使用到的,但你...
  • u010429311
  • u010429311
  • 2016年04月03日 16:46
  • 1605

Android开发——深入理解LayoutInflater

LayoutInflater类可以从XML文件中实例化View对象,其中涉及到XML解析,使用的是PULL解析;从标签实例化View,使用的是反射。 如何获取LayoutInflater?为了获取L...
  • qq_19431333
  • qq_19431333
  • 2016年11月01日 10:28
  • 960

学习Android遇到的问题——LayoutInflater

前言对于像我这样的android初学者来说,LayoutInflater是个很模糊的概念,I can’t feel it!我只知道在自定义控件的时候构造函数中会用到LayoutInflater.fro...
  • small_bo
  • small_bo
  • 2015年11月24日 18:12
  • 434

LayoutInflater的获取和来源解析

LayoutInflater 是个重要的工具类,在android中经常被用到,犹如findViewById一般,findViewById找的是控件view,LayoutInflater找的则是布局la...
  • Deaht_Huimie
  • Deaht_Huimie
  • 2016年09月05日 17:25
  • 335

深入理解LayoutInflater

探究LayoutInflater的实现类##在android程序员写代码的时候,很多时候会用到LayoutInflater来加载指定的布局:LayoutInflater inflater = (Lay...
  • mockingbirds
  • mockingbirds
  • 2016年11月12日 22:38
  • 1217

LayoutParams的用法,及LayoutInflater区别

LayoutParams继承于Android.View.ViewGroup.LayoutParams.        LayoutParams相当于一个Layout的信息包,它封装了Layout的位置...
  • qaz13177_58_
  • qaz13177_58_
  • 2014年03月13日 13:44
  • 1718

Android LayoutInflater原理分析,带你一步步深入了解View(一)

有不少朋友跟我反应,都希望我可以写一篇关于View的文章,讲一讲View的工作原理以及自定义View的方法。没错,承诺过的文章我是一定要兑现的,而且在View这个话题上我还准备多写几篇,尽量能将这个知...
  • sinyu890807
  • sinyu890807
  • 2013年12月19日 08:34
  • 254180

android 自定义View 三 ---- LayoutInflater

说到自定义view就不得提到LayoutInflater,虽然我们在代码中可以直接用new方法构造出各种View,然后再添加各种属性去控制View的大小和位置等布局,但是这是很复杂繁琐的,细节优化更麻...
  • Jo__yang
  • Jo__yang
  • 2016年09月05日 17:56
  • 967
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LayoutInflater
举报原因:
原因补充:

(最多只允许输入30个字)