android LayoutInflater.inflate详解

LayoutInflater概述

从XML文件中实例化一个布局成对应的View类, 它从来不会直接使用, 而是使用getLayoutInflater()或者getSystemService(String)来获得一个对应当前context的标准LayoutInflater 实例。

例如:    


1

2

3

LayoutInflater inflater = (LayoutInflater)context.getSystemService

      (Context.LAYOUT_INFLATER_SERVICE);

如果要在自己的views中通过LayoutInflater.Factory来创建LayoutInflater你可以用cloneInContext(Context)来克隆一个当前存在的ViewFactory然后再用setFactory(LayoutInfalter.FActory) 来设置成自己的FActory.

起因

原来在项目中一直习惯用inflater.inflate(R.layout.layout, null)最近却发现会有一个黄色的警告。 十分好奇,所以决定找出原因。

我们发现inflate方法有两个:

  • View inflate(int resource, ViewGroup root)
  • View inflate(int resource , ViewGroup root, boolean attachToRoot) 第二个参数是指实例的布局所要放入的根视图。

    一般我们在不需要将该布局放入根视图的时候都会把第二个参数传为null,这样系统就不会去进行相应的绑定操作了,不然就蹦了。 我相信很多人都会这样理解,所以都很少用到 第二个方法, 其实这样是错误的。

原因在于android:layout_xyz属性会在父视图中重新计算,而你用第一个方法是说需要被添加到父视图中,只不过你不知道添加到哪一个父视图中, 所以你在xml中定义的LayoutParams 就会被忽略(因为没有已知的父视图)。

示例

大家肯定遇到过在ListViewitem布局中设置的高度没有效果的问题。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<LinearLayout xmlns:android="

http://schemas.android.com/apk/res/android

"

    android:layout_width="match_parent"

    android:layout_height="100dip"

    android:gravity="center_vertical"

    android:orientation="horizontal">

    <TextView

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="test" />

</LinearLayout>


1

2

3

4

5

6

7

8

9

10

11

public View getView(int position, View convertView, ViewGroup parent) {

    if (convertView == null) {

        convertView = inflate(R.layout.item_lv_test, null);

    }

    return convertView;

}

如果用上面的代码会发现设置100dp是无效的。

而如果换成下面的代码就可以了。


1

2

3

4

5

6

7

8

9

10

11

public View getView(int position, View convertView, ViewGroup parent) {

    if (convertView == null) {

        convertView = inflate(R.layout.item_lv_test, nullfalse);

    }

    return convertView;

}

这里你该会想一想为什么很多需要显示View的方法中都有ViewGroup这个参数。

所以有些人会说在跟布局中设置是无效的,要再嵌套一层布局。 这样是错误的,会造成布局层级增多,影响性能。

细节

  • setContentView()LayoutInfalter.inflate()的区别 setContentView()一旦调用,就会立即显示UI.
    LayoutInfalter.inflate()只是把布局转换成对应的View对象,不会立即显示,只有需要的时候再显示出来。
  • View.inflate()方法与LayoutInflater.inflate()的区别
    直接上源码:

1

2

3

4

5

6

7

public static View inflate(Context context, int resource, ViewGroup root) {

    LayoutInflater factory = LayoutInflater.from(context);

    return factory.inflate(resource, root);

}

时间: 2024-11-05 21:59:36

android LayoutInflater.inflate详解的相关文章

LayoutInflater.inflate详解

介绍常见inflate方法 在日常开发中经常会用到通过资源id去获取view的场景,我们通常有四种方式去获取view,分别是以下四种: //1,通过系统服务获取布局加载器 LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(resource,root,attachToRoot); //2,通过activi

Android SlidingMenu 使用详解

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/36677279 很多APP都有侧滑菜单的功能,部分APP左右都是侧滑菜单~SlidingMenu 这个开源项目可以很好帮助我们实现侧滑功能,如果对SlidingMenu 还不是很了解的童鞋,可以参考下本篇博客.将侧滑菜单引入项目的方式很多中,本博客先通过例子介绍各种引入方式,然后给大家展示个实例:主布局ViewPager,左右各一个侧滑菜单的用法,差不多已经能满足大部分应用的需求

Android相机开发详解(一)

Android相机开发详解(一) 请支持原创,尊重原创,转载请注明出处:http://blog.csdn.net/kangweijian(来自kangweijian的csdn博客) Android相机开发能够实现打开相机,前后摄像头切换,摄像预览,保存图片,浏览已拍照图片等相机功能. Android相机开发详解(一)主要实现打开相机,摄像预览,前后置摄像头切换,保存图片等四个功能. Android相机开发详解(二)主要实现翻页浏览相片,触控缩放浏览图片,删除图片,发送图片等四个功能. Andro

Android入门——Fragment详解之基本概念与用法(一)

引言 Android在3.0中引入了Fragments的概念,其目的是用在大屏幕设备上–例如平板电脑上,支持更加动态和灵活的UI设计.平板电脑的屏幕要比手机的大得多,有更多的空间来放更多的UI组件,并且这些组件之间会产生更多的交互.Fragment允许这样的一种设计,而不需要你亲自来管理 Viewhierarchy的复杂变化. 通过将Activity的布局分散到Fragment中, 你可以在运行时修改Activity的外观,并在由Activity管理的back stack中保存那些变化. 一.F

android 上下文菜单详解

本文使用xml来创建上下文菜单 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/add" android:title="添加" android:orderInCategor

android屏幕适配详解

android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 一.关于布局适配建议 1.不要使用绝对布局 2.尽量使用match_parent 而不是fill_parent . 3.能够使用权重的地方尽量使用权重(android:layout_weight) 4.如果是纯色背景,尽量使用android的shape 自定义. 5.如果需要在特定分辨率下适配,可以在res目录上新建layout

Android 四大组件 详解

[置顶] Android四大组件详解 分类: Android四大组件2013-02-09 16:23 19411人阅读 评论(13) 收藏 举报 Android开发 注:本文主要来自网易的一个博主的文章,经过阅读,总结,故留下文章在此 Android四大基本组件介绍与生命周期 Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity : 应用程序中,一个

Android权限Permission详解

android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,Android开发网提示应该是一个类似Windows Mobile中的托盘程序 android.permission.FACTORY_TEST 作为一个工厂测试程序,运行在root用户 android.permission.INSTALL_PACKAGES 允许一个程序安装packages android.permission.INTERNAL_SYSTEM_WINDOW 允许打开窗口使用系统

Android进阶——Preference详解之Preference系的基本应用(三)

引言 前面一篇文章Android进阶--Preference详解之Preference系的基本应用和管理(二)介绍了二级Preference的使用和特点,接下来进入系统给我提供的底级Preference的使用CheckBox选择项CheckBoxPreference.EditText编辑对话框EditTextPreference.列表选择ListPreference.多项选择MultiSelectListPreference. 开关选择SwitchPreference的应用和管理.以期大家能在学