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. 关闭VS的实时调试器

    今天要安装一个水晶报表.安装过程有几个文件有错误.结果这个vs的实时调试器老是调出来.而且还是5次跳出来等你取消5次之后,才到默认的忽略的界面.你知道有多烦的,还得看这他,点完一次还要等几秒钟.差点崩 ...

  2. Java JNI的具体介绍

    JNI就是Java Native Interface的简称,也就是java本地接口.它提供了若干的API实现了和Java和其它语言的通信(主要是C&C++).也许不少人认为Java已经足够强大 ...

  3. NodeJS错误处理最佳实践

    NodeJS的错误处理让人痛苦,在很长的一段时间里,大量的错误被放任不管.但是要想建立一个健壮的Node.js程序就必须正确的处理这些错误,而且这并不难学.如果你实在没有耐心,那就直接绕过长篇大论跳到 ...

  4. 如何学习Linux

    为啥我们要学习Linux 技术的价值不在于这个技术有多么高超,而在于技术本身给我们带来什么价值,所以很多时候我们学习一个技术,不能盲目学,是为了使用这个技术,知道这个技术的使用场景,知道这个技术带来的 ...

  5. [tools]python的mkdocs模块分分钟将md搞成一个网站

    docusaurus: facebook出的一个文档生成器,用起来感觉没那么友善 hugo: 这个很棒 python的mkdocs模块: 用起来最简单 python的这个模块可以分分钟将一坨md假设成 ...

  6. [svc]Iaas Paas Saas区别

    https://www.zhihu.com/question/20387284

  7. UrlOper

    using System; using System.Text.RegularExpressions; using System.Web; using System.Collections.Speci ...

  8. scrollTop兼容封装

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  9. javascript 触发器

    <script type="text/javascript"> function time_logs() { var time = new Date(); var ho ...

  10. form的method用get导致中文乱码

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...