jp1017

jp1017

0个粉丝

78

问答

0

专栏

9

资料

jp1017  发布于  2015-08-21 16:53:44
采纳率 0%
78个问答
5380

安卓中LayoutInflater类及其中inflate方法使用

本帖最后由 jp1017 于 2015-9-11 13:28 编辑

        ListView分批加载这个例子里有好多内容,这里先介绍下LayoutInflater类及其中的inflate方法的使用。

        一、LayoutInflater类:

       

        可以看到这是一个抽象类,他的作用是把layout的xml布局文件生成对应的View对象,并实例化,这个类的作用类似于findViewById(), 不同点是:
         *     LayoutInflater是用来找layout下xml布局文件的,而且它会实例化
         *     findViewById()是找具体xml布局文件下的具体widget控件,比如:Button按钮

        该类的实例化方法有三种:

        1、该类的from方法,从给定的context中获得

        [code]LayoutInflater  inflater = LayoutInflater.from(context);

            Viewview = inflater.inflate(R.layout.mian, null);[/code]

        2、通过SystemService获得,api里也是这么举例的

   [code]         LayoutInflater inflater = (LayoutInflater)context.getSystemServices(Context.LAYOUT_INFLATER_SERVICES);

    View  view = inflater.inflate(R.layout.main, null);[/code]

        3、通过View类下子类window的一个函数getLayoutInflater()

[code]View layout = inflater.inflate(R.layout.main, null);[/code]

        其实,这三个方法本质一样,在底层都是是用到了getSystemServices,
        Activity的getLayoutInflater()方法是调用PhoneWindow的getLayoutInflater()方法,(刚才花了一个小时时间找PhoneWindow类,api里没有,感谢网友吧)看一下该源代码:

[code]public PhoneWindow(Contextcontext) {

        super(context);

        mLayoutInflater= LayoutInflater.from(context);

    }[/code]

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

        在来看下LayoutInflater.from(context)源码:

        [code]public static LayoutInflater from(Context context) {

        LayoutInflater LayoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if(LayoutInflater== null){

            throw new AssertionError("LayoutInflaternot found.");

        }

        return LayoutInflater;

    }[/code]

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

        ListView分批加载用到的就是第三个实例化方法,在activity里实例化页脚,然后把页脚上“正在加载”动画加到ListView上。

        二、inflate方法:

       

        可以看到该方法有四种重载形式,这里用的第一个方法,第一个参数resource是想要用的布局文件的id,第二个参数root是持有选项卡的内容,获取FrameLayout ,其他方法类似。

        下面是网上的:

        inflate就相当于将一个xml中定义的布局找出来.     
         * 因为如果在一个Activity文件里直接用findViewById()这个方法的话,
         * 那么它所对应的是setConentView()中调用的那个layout里的组件.
         * 因此如果在同样的Activity里用到别的layout的话,
         *     而且你还要设置这个layout里的组件(比如:ImageView,TextView)上的内容,
         *     那么你就必须用inflate()先将这个layout找出来, 然后再用这个layout对象去找到它上面的组件
         *     然后进行一系列的操作

        一句话,这个inflate就是个中介,你这个activity要用别的布局里的组件,你就要先找到这个布局,inflate就是这个角色了。


        好了,就是这个样子。enjoy!!!


       
我来回答
回答3个
时间排序
认可量排序

jp1017

0个粉丝

78

问答

0

专栏

9

资料

jp1017 2015-08-21 16:57:39
认可0
这个代码功能太差了。。。。。。。。。。。:(:(:(:(:(:(:(:(:(:(:(

jp1017

0个粉丝

78

问答

0

专栏

9

资料

jp1017 2015-11-13 19:51:34
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=21965&ptid=8533]dondeng 发表于 2015-11-10 20:00[/url]
来学习的。[/quote]

我也学习中,多多指导

dondeng

0个粉丝

3

问答

0

专栏

1

资料

dondeng 2015-11-10 20:00:47
认可0
:lol 来学习的。
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区