Android学习之LayoutInflater类和inflate()方法的使用

转载 2015年07月07日 10:35:42

1.首先来说明一下LayoutInflater这个类中inflate()这个方法的作用:

inflate方法的主要作用就是将xml转换成一个View对象,用于动态的创建布局。它的作用类似于findViewById()。

不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。

2.获取LayoutInflater实例化的方法有如下三种:

1.通过SystemService获得:

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

2.通过给定的context中获得:

LayoutInflater inflater = LayoutInflater.from(context);

3.在activity中获得:

LayoutInflater inflater = getLayoutInflater();(在Activity中可以使用,实际上是View子类下window的一个函数)

这三种方式最终本质是都是调用的Context.getSystemService()。看一下该源代码:

    // 1.Activity的getLayoutInflater()方法是调用PhoneWindow的getLayoutInflater()方法。
    publicPhoneWindow(Contextcontext) {

        super(context);

        mLayoutInflater= LayoutInflater.from(context);
    }
    // 可以看出它其实是调用LayoutInflater.from(context)。

    2.LayoutInflater.from(context):
    public static LayoutInflaterfrom(Context context) {

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

        if(LayoutInflater== null){

            thrownew AssertionError("LayoutInflaternot found.");

        }
        returnLayoutInflater;
    }
    //可以看出它其实调用context.getSystemService()。

另外getSystemService()是Android很重要的一个API,它是Activity的一个方法,根据传入的NAME来取得对应的Object,然后转换成相应的服务对象。
以下介绍系统相应的服务

传入的Name 返回的对象 说明
WINDOW_SERVICE WindowManager 管理打开的窗口程序
LAYOUT_INFLATER_SERVICE LayoutInflater取得xml里定义的view
ACTIVITY_SERVICE ActivityManager管理应用程序的系统状态
POWER_SERVICE PowerManger电源的服务
ALARM_SERVICE AlarmManager闹钟的服务
NOTIFICATION_SERVICE NotificationManager状态栏的服务
KEYGUARD_SERVICE KeyguardManager键盘锁的服务
LOCATION_SERVICE LocationManager位置的服务,如GPS
SEARCH_SERVICE SearchManager搜索的服务
VEBRATOR_SERVICE Vebrator手机震动的服务
CONNECTIVITY_SERVICE Connectivity网络连接的服务
WIFI_SERVICE WifiManagerWi-Fi服务
TELEPHONY_SERVICE TeleponyManager电话服务

3.inflate()方法的调用方式:

这个方法重载了四种调用方式,分别为:

1. public View inflate(int resource, ViewGroup root);

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

3.public View inflate(XmlPullParser parser, ViewGroup root);

4.public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot);

虽然重载了四个方法,但是这四种方法最终调用的,还是第四种方式。
第四种方式也很好理解,内部实现原理就是利用Pull解析器,对Xml文件进行解析,然后返回View对象。

inflate()方法中有三个参数,分别是

1.resource 布局的资源id
2.root 填充的根视图
3.attachToRoot 是否将载入的视图绑定到根视图中

下面例出该方法的实际应用:

首先创建layout的xml文件

<!--?xml version="1.0" encoding="utf-8"?-->
<linearlayout 
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="match_parent"
	android:layout_height="50dp"
	android:background="@android:color/green"
	android:gravity="center"
	android:orientation="vertical">
	
	<textview
		android:id="@+id/textView"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:text="text"
		android:textcolor="@android:color/black"
		android:textsize="20sp">
	</textview>
</linearlayout>
Activity中的代码如下:

public class TestActivity extends Activity {
	    private ListView list;
	 
	    @Override
	    protected void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);
	        setContentView(R.layout.activity_two);
	        list = (ListView) findViewById(R.id.list);
	        list.setAdapter(new MyAdapter(this));
	    }
	 
	    private class MyAdapter extends BaseAdapter {
	 
	        private LayoutInflater inflater;
	 
	        MyAdapter(Context context) {
	            inflater = LayoutInflater.from(context);
	        }
	 
	        @Override
	        public int getCount() {
	            return 20;
	        }
	 
	        @Override
	        public Object getItem(int position) {
	            return position;
	        }
	 
	        @Override
	        public long getItemId(int position) {
	            return position;
	        }
	 
	        @Override
	        public View getView(int position, View convertView, ViewGroup parent) {
	 
	            if (convertView == null) {
	                convertView = inflater.inflate(R.layout.item_list, parent,false);
	            }
	            TextView tv = (TextView) convertView.findViewById(R.id.textView);
	            tv.setText(position + "");
	            return convertView;
	        }
	    }
	}




三种方式获得LayoutInflater 实例以及两种形式inflate方法

三种方式获得LayoutInflater实例以及两种方式执行inflate方法 A.三种方式获得LayoutInflater 实例 在实际开发中LayoutInflater这...
  • xhw035
  • xhw035
  • 2016年08月08日 18:31
  • 946

Android LayoutInflater inflate 理解

Android LayoutInflater的理解
  • u011675349
  • u011675349
  • 2016年01月24日 18:22
  • 822

Android编程之LayoutInflater的inflate方法详解

LayoutInflater的inflate方法,在fragment的onCreateView方法中经常用到
  • xyz_fly
  • xyz_fly
  • 2014年07月18日 15:40
  • 67408

三个案例带你看懂LayoutInflater中inflate方法两个参数和三个参数的区别

关于inflate参数问题,我想很多人多多少少都了解一点,网上也有很多关于这方面介绍的文章,但是枯燥的理论或者翻译让很多小伙伴看完之后还是一脸懵逼,so,我今天想通过三个案例来让小伙伴彻底的搞清楚这个...
  • u012702547
  • u012702547
  • 2016年09月23日 00:12
  • 26307

inflate和findViewById方法对比

Inflate()作用就是将xml定义的一个布局找出来,但仅仅是找出来而且隐藏的,没有找到的同时并显示功能。最近做的一个项目就是这一点让我迷茫了好几天。 android上还有一个与Inflate...
  • shuitawuhen
  • shuitawuhen
  • 2014年01月23日 11:40
  • 668

Android自定义View开篇之(LayoutInflater.inflate()详解)

学习自定义View一段时间了,从开始的一窍不通到现在终于能写出点东西了,前面也写过几篇关于自定义view的博客,但是感觉这东西吧,一天不敲又忘记了,所以准备写一篇自定义View系列的博客,这也算是我这...
  • vv_bug
  • vv_bug
  • 2016年09月20日 21:49
  • 2471

Android自定义UI陷阱:LayoutInflater.from().inflate()一定不能工作在父类或虚类里

问题背景:有一些UI具有共性,比如常见的app第一次运行时出现的各种指示框,告诉你往哪搓是调音量的,往哪点是调屏幕亮度的,当点击这些VIew,则其自动消失。或者一动时间后,自动消失。另外一个问题是,不...
  • yanzi1225627
  • yanzi1225627
  • 2014年07月06日 16:04
  • 24828

Android LayoutInflater inflate方法效率

很多Android开发可能知道, LayoutInflater.inflate()方法是个耗时操作, 应尽量避免调用. 我也曾经非常担心在Adapter和ViewGroup动态循环添加View时耗时太...
  • David_Ding
  • David_Ding
  • 2017年01月11日 17:54
  • 1262

Android - LayoutInflater和inflate方法的用法

在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例...
  • robertcpp
  • robertcpp
  • 2016年05月28日 08:03
  • 7769

Android编程之LayoutInflater的inflate方法实例

LayoutInflater的inflate方法实例
  • xyz_fly
  • xyz_fly
  • 2014年07月21日 09:22
  • 27337
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android学习之LayoutInflater类和inflate()方法的使用
举报原因:
原因补充:

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