LayoutInflater





以下出自http://www.open-open.com/lib/view/open1328837587484.html

LayoutInflater作用是将layoutxml布局文件实例化为View类对象。

获取LayoutInflater的方法有如下三种:

?
LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.main, null );
 
LayoutInflater inflater = LayoutInflater.from(context); (该方法实质就是第一种方法,可参考源代码)
View layout = inflater.inflate(R.layout.main, null );
 
LayoutInflater inflater = getLayoutInflater();(在Activity中可以使用,实际上是View子类下window的一个函数)
View layout = inflater.inflate(R.layout.main, null );

getLayoutInflater():
Activity的getLayoutInflater()方法是调用PhoneWindow的getLayoutInflater()方法,看一下该源代码:
    publicPhoneWindow(Contextcontext) {
        super(context);
        mLayoutInflater= LayoutInflater.from(context);
    }
可以看出它其实是调用LayoutInflater.from(context)。
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()。


一直有点纠结setContentViewinflate的区别找了一些资料。写了个小程序看了下:

?
public class MyInflate extends Activity{
     private TextView tv;
     public void OnCreate(Bundle savedInstanceState){
         super .onCreate(savedInstanceState);
         //setContentView(R.layout.main);
         //tv = (TextView) findViewById(R.id.tv);
 
         LayoutInflater inflate = LayoutInflater.from( this );
         View view = inflate.inflate(R.layout.main, null );
         setContentView(view);
     }
}

上述注释掉的代码和没有注释掉的代码两种情况是相同的。

区别:
setContentView()
一旦调用, layout就会立刻显示UI;而inflate只会把Layout形成一个以view类实现成的对象,有需要时再用setContentView(view)显示出来。一般在activity中通过setContentView()将界面显示出来,但是如果在非activity中如何对控件布局设置操作了,这就需要LayoutInflater动态加载。

public View inflate(int Resourece,ViewGroup root)
作用:填充一个新的视图层次结构从指定的
XML资源文件中
reSource
ViewlayoutID
root
 生成的层次结构的根视图
return 
填充的层次结构的根视图。如果参数root提供了,那么root就是根视图;否则填充的XML文件的根就是根视图。

其余几个重载的inflate函数类似。










以下出自 “ Android_Tutor ” 博客,请务必保留此出处 http://weizhulin.blog.51cto.com/1556324/311450
在实际开发种LayoutInflater这个类的作用类似于 findViewById(),
不同点是LayoutInflater是用来找layout下xml布局文件,并且实例化!而findViewById()是找具体xml下的具体 widget控件(如:Button,TextView等)。
为了让大家容易理解我做了一个简单的Demo,主布局main.xml里有一个TextView和一个Button,当点击Button,出现 Dialog,而这个Dialog的布局方式是我们在layout目录下定义的custom_dialog.xml文件(里面左右分布,左边 ImageView,右边TextView)。
效果图如下:
 
下面我将详细的说明Demo的实现过程:
1、新建一个 Android工程,我们命名为LayoutInflaterDemo.
2、修改main.xml布局,里面主要在原来基础上增加了一个Button.代码如下:
 
 
  1. view plaincopy to clipboardprint?  
  2. <?xml version="1.0"      
  3. encoding="utf-8"?>     
  4. <LinearLayout      
  5. xmlns:android="http://schemas.android.com/apk/res/android"    
  6.     android:orientation="vertical"    
  7.     android:layout_width="fill_parent"    
  8.     android:layout_height="fill_parent"    
  9.     >     
  10. <TextView       
  11.     android:layout_width="fill_parent"      
  12.     android:layout_height="wrap_content"      
  13.     android:text="@string/hello"    
  14.     />     
  15. <Button     
  16.     android:id="@+id/button"    
  17.     android:layout_width="wrap_content"    
  18.     android:layout_height="wrap_content"    
  19.     android:text="ShowCustomDialog"    
  20.     />     
  21. </LinearLayout>    
  22. <?xml version="1.0"   
  23. encoding="utf-8"?> 
  24. <LinearLayout   
  25. xmlns:android="http://schemas.android.com/apk/res/android" 
  26.     android:orientation="vertical" 
  27.     android:layout_width="fill_parent" 
  28.     android:layout_height="fill_parent" 
  29.     > 
  30. <TextView    
  31.     android:layout_width="fill_parent"   
  32.     android:layout_height="wrap_content"   
  33.     android:text="@string/hello" 
  34.     /> 
  35. <Button 
  36.  android:id="@+id/button" 
  37.  android:layout_width="wrap_content" 
  38.  android:layout_height="wrap_content" 
  39.  android:text="ShowCustomDialog" 
  40.  /> 
  41. </LinearLayout> 
 
3.定义对话框的布局方式,我们在layout目录下,新建一个名为 custom_dialog.xml文件具体代码如下:
 
 
  1. view plaincopy to clipboardprint?  
  2. <?xml version="1.0"      
  3. encoding="utf-8"?>     
  4. <LinearLayout      
  5. xmlns:android="http://schemas.android.com/apk/res/android"    
  6.               android:orientation="horizontal"    
  7.               android:layout_width="fill_parent"    
  8.               android:layout_height="fill_parent"    
  9.               android:padding="10dp"    
  10.               >     
  11.     <ImageView android:id="@+id/image"    
  12.                android:layout_width="wrap_content"    
  13.                android:layout_height="fill_parent"    
  14.                android:layout_marginRight="10dp"    
  15.                />     
  16.     <TextView android:id="@+id/text"    
  17.               android:layout_width="wrap_content"    
  18.               android:layout_height="fill_parent"    
  19.               android:textColor="#FFF"    
  20.               />     
  21. </LinearLayout>    
  22. <?xml version="1.0"   
  23. encoding="utf-8"?> 
  24. <LinearLayout   
  25. xmlns:android="http://schemas.android.com/apk/res/android" 
  26.               android:orientation="horizontal" 
  27.               android:layout_width="fill_parent" 
  28.               android:layout_height="fill_parent" 
  29.               android:padding="10dp" 
  30.               > 
  31.     <ImageView android:id="@+id/image" 
  32.                android:layout_width="wrap_content" 
  33.                android:layout_height="fill_parent" 
  34.                android:layout_marginRight="10dp" 
  35.                /> 
  36.     <TextView android:id="@+id/text" 
  37.               android:layout_width="wrap_content" 
  38.               android:layout_height="fill_parent" 
  39.               android:textColor="#FFF" 
  40.               /> 
  41. </LinearLayout> 
 
4.修改主程序LayouInflaterDemo.java代码如下:
 
 
 
  1. view plaincopy to clipboardprint?  
  2. package com.android.tutor;     
  3. import android.app.Activity;     
  4. import android.app.AlertDialog;     
  5. import android.content.Context;     
  6. import android.os.Bundle;     
  7. import android.view.LayoutInflater;     
  8. import android.view.View;     
  9. import android.view.View.OnClickListener;     
  10. import android.widget.Button;     
  11. import android.widget.ImageView;     
  12. import android.widget.TextView;     
  13. public class LayoutInflaterDemo extends Activity implements      
  14. OnClickListener {     
  15.          
  16.     private Button button;     
  17.     public void onCreate(Bundle savedInstanceState) {     
  18.         super.onCreate(savedInstanceState);     
  19.         setContentView(R.layout.main);     
  20.              
  21.         button = (Button)findViewById(R.id.button);     
  22.         button.setOnClickListener(this);     
  23.     }     
  24.     @Override    
  25.     public void onClick(View v) {     
  26.              
  27.         showCustomDialog();     
  28.     }     
  29.          
  30.     public void showCustomDialog()     
  31.     {     
  32.         AlertDialog.Builder builder;     
  33.         AlertDialog alertDialog;     
  34.         Context mContext = LayoutInflaterDemo.this;     
  35.              
  36.         //下面俩种方法都可以     
  37.         LayoutInflater inflater = getLayoutInflater();     
  38.         LayoutInflater inflater = (LayoutInflater)      
  39. mContext.getSystemService(LAYOUT_INFLATER_SERVICE);     
  40.         View layout = inflater.inflate(R.layout.custom_dialog,null);     
  41.         TextView text = (TextView) layout.findViewById(R.id.text);     
  42.         text.setText("Hello, Welcome to Mr Wei's blog!");     
  43.         ImageView image = (ImageView) layout.findViewById(R.id.image);     
  44.         image.setImageResource(R.drawable.icon);     
  45.         builder = new AlertDialog.Builder(mContext);     
  46.         builder.setView(layout);     
  47.         alertDialog = builder.create();     
  48.         alertDialog.show();     
  49.     }     
  50. }    
  51. package com.android.tutor;  
  52. import android.app.Activity;  
  53. import android.app.AlertDialog;  
  54. import android.content.Context;  
  55. import android.os.Bundle;  
  56. import android.view.LayoutInflater;  
  57. import android.view.View;  
  58. import android.view.View.OnClickListener;  
  59. import android.widget.Button;  
  60. import android.widget.ImageView;  
  61. import android.widget.TextView;  
  62. public class LayoutInflaterDemo extends Activity implements   
  63. OnClickListener {  
  64.       
  65.  private Button button;  
  66.     public void onCreate(Bundle savedInstanceState) {  
  67.         super.onCreate(savedInstanceState);  
  68.         setContentView(R.layout.main);  
  69.           
  70.         button = (Button)findViewById(R.id.button);  
  71.         button.setOnClickListener(this);  
  72.     }  
  73.  @Override 
  74.  public void onClick(View v) {  
  75.     
  76.   showCustomDialog();  
  77.  }  
  78.    
  79.  public void showCustomDialog()  
  80.  {  
  81.   AlertDialog.Builder builder;  
  82.   AlertDialog alertDialog;  
  83.   Context mContext = LayoutInflaterDemo.this;  
  84.     
  85.   //下面俩种方法都可以  
  86.   LayoutInflater inflater = getLayoutInflater();  
  87.   LayoutInflater inflater = (LayoutInflater)   
  88. mContext.getSystemService(LAYOUT_INFLATER_SERVICE);  
  89.   View layout = inflater.inflate(R.layout.custom_dialog,null);  
  90.   TextView text = (TextView) layout.findViewById(R.id.text);  
  91.   text.setText("Hello, Welcome to Mr Wei's blog!");  
  92.   ImageView image = (ImageView) layout.findViewById(R.id.image);  
  93.   image.setImageResource(R.drawable.icon);  
  94.   builder = new AlertDialog.Builder(mContext);  
  95.   builder.setView(layout);  
  96.   alertDialog = builder.create();  
  97.   alertDialog.show();  
  98.  }  
  99. }   



另外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 WifiManager Wi-Fi服务
TELEPHONY_SERVICE TeleponyManager 电话服务
inflate 方法
通过 sdk 的 api 文档,可以知道该方法有以下几种过载形式,返回值均是 View 对象,如下:
public View inflate (int resource, ViewGroup root) 
public View inflate (XmlPullParser parser, ViewGroup root)
public View inflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot)  
public View inflate (int resource, ViewGroup root, boolean attachToRoot)
示意代码:
LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);       
View view = inflater.inflate(R.layout.custom, (ViewGroup)findViewById(R.id.test));       
//EditText editText = (EditText)findViewById(R.id.content);// error 
EditText editText = (EditText)view.findViewById(R.id.content);
对于上面代码,指定了第二个参数 ViewGroup root,当然你也可以设置为 null 值。
注意:
·inflate 方法与 findViewById 方法不同;
·inflater 是用来找 res/layout 下的 xml 布局文件,并且实例化;
·findViewById() 是找具体 xml 布局文件中的具体 widget 控件(如:Button、TextView 等)。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值