转自:http://lpqsun-126-com.iteye.com/blog/1158070


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

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

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

Java代码
  1. publicabstractclassLayoutInflaterextendsObject

获得 LayoutInflater 实例的三种方式:

Java代码
  1. 1.LayoutInflaterinflater=getLayoutInflater();//调用Activity的getLayoutInflater()
  2. 2.LayoutInflaterlocalinflater=(LayoutInflater)context.getSystemService
  3. (Context.LAYOUT_INFLATER_SERVICE);
  4. 3.LayoutInflaterinflater=LayoutInflater.from(context);

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

getLayoutInflater():

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

Java代码
  1. publicPhoneWindow(Contextcontext){
  2. super(context);
  3. mLayoutInflater=LayoutInflater.from(context);
  4. }

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

LayoutInflater.from(context):

Java代码
  1. publicstaticLayoutInflaterfrom(Contextcontext){
  2. LayoutInflaterLayoutInflater=
  3. (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  4. if(LayoutInflater==null){
  5. thrownewAssertionError("LayoutInflaternotfound.");
  6. }
  7. returnLayoutInflater;
  8. }

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

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

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

Java代码
  1. publicViewinflate(intresource,ViewGrouproot)
  2. publicViewinflate(XmlPullParserparser,ViewGrouproot)
  3. publicViewinflate(XmlPullParserparser,ViewGrouproot,booleanattachToRoot)
  4. publicViewinflate(intresource,ViewGrouproot,booleanattachToRoot)

1:

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

2:

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

3:

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

4:

publicViewinflate (int resource,ViewGrouproot, boolean attachToRoot)

resource:View的layout的ID

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

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

attachToRoot:

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

示意代码:

Java代码
  1. LayoutInflaterinflater=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
  2. Viewview=inflater.inflate(R.layout.custom,(ViewGroup)findViewById(R.id.test));
  3. //EditTexteditText=(EditText)findViewById(R.id.content);//error
  4. EditTexteditText=(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);注:每解析一次都会产生不同的对象
然后你再引用没问题,使用自如了。


更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Android(安卓)设置TextView字体颜色
  3. 迁移到 AndroidX 过程中遇到的各种问题
  4. Android开发点滴 - 实现层级式导航(API 16+)
  5. 【Android(安卓)- MD】之NavigationView的使用
  6. Android客制化------在设置中加入RAM flash计算
  7. 浅谈Java回调机制
  8. android背景选择器总结
  9. Android的JS调用Java代码或使用了Javascript相关技术,如何混淆

随机推荐

  1. Android中的进程
  2. Android(安卓)studio Github 断开连接
  3. Android(安卓)Native C++ 层中使用AudioR
  4. 『ANDROID』App工程结构搭建:几种常见Andr
  5. 面试问题之:Android中消息系统模型和Handl
  6. Android(安卓)闹钟机制实现定时任务
  7. Android_MVC模式
  8. android 示例源码
  9. Android笔记:Android(安卓)adb shell 命令
  10. android中的jar包反编译修改心得