Android中获得 LayoutInflater 实例的三种方式

Android  2017年10月23日 pm8:20发布7年前 (2017)更新 91es.com站长
99 0 0

以下文章对LayoutInflater总结的不错,摘抄于此,部分内容稍微改动。

在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。

具体作用:

  1. 对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;
  2. 对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。

Android中获取LayoutInflater 的方式有如下三种:

//方法1
LayoutInflater inflater_1 = getLayoutInflater(); // 调用Activity的getLayoutInflater()

//方法2
LayoutInflater inflater_2 = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

//方法3
LayoutInflater inflater_3 = LayoutInflater.from(mContext);

然而我们从源码中看的话,发现上面三种方法的本质都是一样的。

在(\framework\base\core\java\android\view\LayoutInflater.java)

中LayoutInflater 是个抽象函数

public abstract class LayoutInflater
{
     ....
}

我们在Activity中调用直接是使用Activity中封装的方法,从getLayoutInflater()开始往前看看LayoutInflater是怎么初始化的。

在 (\framework\base\core\java\android\app\Activity.java)

//Activity是调用PhoneWindow中初始化的LayoutInflater
public LayoutInflater getLayoutInflater() {
return getWindow().getLayoutInflater();
}

//获取PhoneWindow
public Window getWindow() {
return mWindow;
}

//PhoneWindow的初始化
final void attach(Context context, ActivityThread aThread,
Instrumentation instr, IBinder token, int ident,
Application application, Intent intent, ActivityInfo info,
CharSequence title, Activity parent, String id,
NonConfigurationInstances lastNonConfigurationInstances,
Configuration config, String referrer, IVoiceInteractor voiceInteractor) {

   ....

mWindow = new PhoneWindow(this);

   ....

}

在(\framework\base\core\java\com\android\internal\policy\PhoneWindow.java)

//获取初始化过的mLayoutInflater
@Override
public LayoutInflater getLayoutInflater() {
return mLayoutInflater;
}

//而mLayoutInflater是调用LayoutInflater中的from方法初始化的
public PhoneWindow(Context context) {
super(context);
mLayoutInflater = LayoutInflater.from(context);
}

又在(\framework\base\core\java\android\view\LayoutInflater.java)

//LayoutInflater.java中的初始化方法
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;
}

经过上面代码的流程,发现3中LayoutInflater的获取本质是一样的。

 历史上的今天

  1. 2024: shell脚本执行提示bad interpreter...(0条评论)
  2. 2019: 刘瑜:过去的怎样让它过去(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

林夕:赏味期限

那还是你和好友说着想要去很多很多地方的年纪。你踢踢踏踏地在走廊里面一边走一边数着自己到底想去多少个地方,好友跟在你的后面臭着一张脸喊,好高骛远的家伙,离开这里看谁天天陪你。你转身去拉她的手,笑得相当谄媚,说你可以陪我一起去呀。好友摇着手告诉你去去去,先把英文考及格了再说吧。所谓好友到底可以好成...

Source Insight 4.0常用快捷键

前言简单记录一下Source Insight 4.0中快捷键的使用。方便自己查阅。正文常用快捷键ctrl + 鼠标滚轮 :可放大、缩小显示字体ctrl + 鼠标左键 :跳转到函数定义ctrl + G :跳转到当前文件某一行ctrl + H :替换字符Alt+Shi...

梁漱溟:花点心思活着,人生才有意义

一人们常常爱问:人生有没有目的?有没有意义?不知同学们对于这一类的问题想过没有?如果想过,其答案为何?要是大家曾用过一番心思,我来讲这问题就比较容易了,你们就可以比较容易地了解我的话。我以为人生不好说目的,因为目的是后来才有的事。我们先要晓得什么叫做目的。比如,我们这次来兴安,是想看灵渠,如果我...

Android图片旋转+倒影

前言根据前面两篇文章,这里进行组合也就是倒影+旋转,顺便加上了倒影渐变。效果如图。正文直接上代码<!-- layout_height= 倒影高度+分割线高度+图片高度,否则显示不全 -->​<com.biumall.reflectview.view.Rotat...

嫣然若雪:余生,看淡所有,珍惜拥有

现实生活中,有太多的欲望,求不到,爱不得,为自己搭建了牢笼,囚禁在很深的执念里,得不到,放不下。人生本就不易,生活里本就有太多的苦,烦恼不捡自然无,要捡天天有,没有谁能把日子过得一直顺遂。有些人,因为自己的执念,让生活增添不必要的负担;有些人,因为一点小事,让自己活得心烦意乱。人生的痛苦都是自...

[代码片段]Activity手动设置全屏和非全屏

前言Android开发项目中有些App的部分界面需要全屏,比如视频播放界面,进入时手动全屏,退出时恢复全屏状态。下面记录一下常用的全屏方式。正文当系统全屏时,很多悬浮窗会向上移动一小段距离,原因窗口布局是从状态栏之后开始的,全屏时没有状态栏了,所以会向上移动,给窗口加上,就可以解决。ge...