LayoutInflater类用于查找布局文件并实例化。用于动态将布局加入界面中。

参考链接

http://blog.csdn.net/guolin_blog/article/details/12921889

http://blog.sina.com.cn/s/blog_5da93c8f0100xm6n.html

分析

  • 生成LayoutInflater实例2种方法

LayoutInflater layoutInflater = LayoutInflater.from(context);

或者

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

其中context是Activity的上下文内容。如果在activity中可以通过this表示,或者可通过getApplicationContext()获取。

  • setContentview()区别

使用setContentView()函数设置了布局,会马上显示在UI中。而LayoutInflater的实例却不会。

  • findViewById()

findViewById()只能查找setContentView()中设置的layout布局中的控件。

如果setContentView()所设置的布局中没有所要访问的控件,而在其他布局文件中,直接使用findViewById()访问会出错。

需要先通过LayoutInflater类现将对应的布局实例化之后,并添加到布局中(不添加也看不到控件).再通过findViewById()。

Example

根据参考链接的源码,记录于此。

  • activity_main.xml

主要的布局文件,一个RelativeLayout,里面什么也没有。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:id="@+id/main_layout"
tools:context="com.example.inflatetest.MainActivity"> </RelativeLayout>
  • button_layout.xml

将要将这个布局动态添加到activity_main.xml中。里面有LinearLayout和Button。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"> <Button
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/btn"
android:text="button"
/> </LinearLayout>
  • AndroidManifest.xml

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.inflatetest"> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>
  • ManiActivity.java

主要代码如下。

使用首先实例化LayoutInflater,

然后使用inflate()加载要添加的布局文件

最后使用addView()添加到activity_main.xml中。

之后使用findViewById()查找button才会成功。

package com.example.inflatetest;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.Toast; public class MainActivity extends AppCompatActivity {
private RelativeLayout mainLayout; Button btn; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 创建LayoutInflater实例
LayoutInflater layoutInflater = LayoutInflater.from(this);
// 另外一种方法生成LayoutInflater实例。
// LayoutInflater layoutInflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// 通过LayoutInflater获取布局文件
View buttonLayout = layoutInflater.inflate(R.layout.button_layout, null); // 将获取的布局添加到当前布局中。
mainLayout = (RelativeLayout) findViewById(R.id.main_layout);
mainLayout.addView(buttonLayout); // 使用inflater获取布局并添加之后,下面两种方法都可以。
// btn = (Button) buttonLayout.findViewById(R.id.btn);
btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "button click", Toast.LENGTH_SHORT).show();
}
});
}
}

显示效果:

Tony Liu

2017-3-17, Shenzhen

android LayoutInflater 笔记的更多相关文章

  1. 【转】 Pro Android学习笔记(五六):配置变化

    目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...

  2. 【转】 Pro Android学习笔记(二二):用户界面和控制(10):自定义Adapter

    目录(?)[-] 设计Adapter的布局 代码部分 Activity的代码 MyAdapter的代码数据源和构造函数 MyAdapter的代码实现自定义的adapter MyAdapter的代码继续 ...

  3. android 应用笔记

    android 应用笔记 android 应用笔记 小书匠 Android 综合教程 Android常用技巧 安卓系统架构 安卓源码开发 安卓驱动 Linux内核 安卓应用开发 Java 教程 tic ...

  4. Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容: 1.使用Volley实现异步加载Json数据...   Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...

  5. Android开发笔记:打包数据库

    对于数据比较多的控制一般会加入SQLite数据库进行数据存储,在打包时这些数据库是不自动打包到apk中的,如何创建数据库呢 方法1:将创建数据库的sql语句在SQLiteHelper继承类中实现,在第 ...

  6. Android学习笔记进阶之在图片上涂鸦(能清屏)

    Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...

  7. android学习笔记36——使用原始XML文件

    XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...

  8. Android学习笔记之JSON数据解析

    转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...

  9. Android开发笔记--hello world 和目录结构

    原文:Android开发笔记--hello world 和目录结构 每接触一个新东西 都有一个hello world的例子. 1.新建项目 2.配置AVD AVD 没有要新建个,如果不能创建 运行SD ...

随机推荐

  1. 使用和学习 ES2015

    调试网站 http://babeljs.io/repl/ 扩展阅读: # export.exports.modules.exports 和 require .import 的一些常用方法和套路 htt ...

  2. django中templates阅读笔记

    一.基本知识 1.模版是独立于django的,可以独立运行. 模版变量是用两个大括号括起来的字符串,表示变量.例如{{ person_name }} 模版标签,是用一对大括号和一对百分号括起来的,例如 ...

  3. python 列表排序方法reverse、sort、sorted基础篇

    python语言中的列表排序方法有三个:reverse反转/倒序排序.sort正序排序.sorted可以获取排序后的列表.在更高级列表排序中,后两中方法还可以加入条件参数进行排序. reverse() ...

  4. [转帖]cocos2D-X源码分析之从cocos2D-X学习OpenGL(3)----BATCH_COMMAND

    原贴: cocos2D-X源码分析之从cocos2D-X学习OpenGL(3)----BATCH_COMMAND 上一篇介绍了QUAD_COMMAND渲染命令,顺带介绍了VAO和VBO,这一篇介绍批处 ...

  5. Zuul:构建高可用网关之多维度限流

    对请求的目标URL进行限流(例如:某个URL每分钟只允许调用多少次) 对客户端的访问IP进行限流(例如:某个IP每分钟只允许请求多少次) 对某些特定用户或者用户组进行限流(例如:非VIP用户限制每分钟 ...

  6. html5和css3学习历程

    1.video,audio视频和音频的应用 <!doctype html><html> <head></head> <body>  < ...

  7. java 多线程1:进程与线程概述

    进程和线程 谈到多线程,就得先讲进程和线程的概念. 进程 进程可以理解为受操作系统管理的基本运行单元.360浏览器是一个进程.WPS也是一个进程,正在操作系统中运行的".exe"都 ...

  8. c++之---初探重载操作符

    #include<iostream> using namespace std; class Test { friend Test addTest(Test &obj1, Test ...

  9. Clock函数用法

    clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t.在MSDN中,查得对clock函数定义如下: clock_t clock(void) ; 这个函数返回从“开启这个程序进程 ...

  10. winform文本框不能粘贴、复制和屏蔽右键

    有3个常用方法 1.MouseMove事件中,使选不中 private void textBox3_MouseMove(object sender, MouseEventArgs e) { if (t ...