前言

在写Android的xml布局时,用好 includeViewStubmerge这三个标签,可以是我们的xml更加简洁、高效。

include

按照官方的意思,include就是为了解决重复定义相同布局的问题。
相当于Java代码中将相同的部分抽取出来,然后复用,需要的时候引入它即可,而不必每次都自己写一遍。

举例说明:

一个公共布局文件 my_layout.xml(这个布局后面例子也会用到):

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

使用这个公共布局文件:

<?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="match_parent"android:orientation="vertical"><includeandroid:id="@+id/include_layout"layout="@layout/my_layout"android:layout_width="match_parent"android:layout_height="wrap_content"/>
</LinearLayout>
注意事项:

使用 include 最常见的问题就是 findViewById 时候出现 NullPointerException
这个问题出现的前提是在 <include /> 中设置了id,被 include 进来的布局的根元素也设置了id。
那么这时使用被 include 进来的根元素id进行 findViewById 就会出现NullPointerException

在上述例子中:

findViewById(R.id.include_layout);// 正常
findViewById(R.id.linearLayout);// 会出现NullPointerException
findViewById(R.id.button);// 正常
findViewById(R.id.textView); // 正常

ViewStub

ViewStub就是一个宽高都为0的一个View,它默认是不可见的。
只有通过调用 setVisibility() 函数或者 Inflate() 函数才会将其要装载的目标布局给加载出来,从而达到延迟加载的效果。
ViewStub布局可显示之前,系统不会消耗资源去实例化里面的布局,可以节省系统资源消耗。

设置 ViewStub 中延时加载的布局有两种方式:

  1. 在xml中使用 android:layout 属性来设置。
  2. 在代码中使用 ViewStub.setLayoutResource(res); 来设置。

使ViewStub中布局显示出来也有两种方法:

  1. 调用 ViewStub.setVisibility(View.VISIBLE);
  2. 调用 ViewStub.inflate();

这两个方法本质上都是调用ViewStub.inflate();来实现布局的加载显示。

举例说明:
<ViewStubandroid:id="@+id/view_stub"android:layout_width="fill_parent"android:layout_height="49dp"android:layout="@layout/my_layout"android:inflatedId="@+id/view_stub_inflated_id"/>
// my_layout 布局文件就是上文中的 my_layout.xml
// 第一种使用方法:
//使用android:layout="@layout/my_layout"设置布局
ViewStub viewStub = (ViewStub) findViewById(R.id.view_stub);
//设置setVisibility,使布局文件实例化
viewStub .setVisibility(View.VISIBLE);
// 通过ViewStub的xml中的属性 inflatedId 来获取View
LinearLayout linearLayout =(LinearLayout) findViewById(R.id.view_stub_inflated_id);
if ( viewStub.getVisibility() == View.VISIBLE ) {  // 已经加载成功
}
// 第二种使用方法:
ViewStub viewStub = (ViewStub) findViewById(R.id.view_stub);
viewStub.setLayoutResource(R.layout.my_layout);
//使用 inflate,使布局文件实例化
LinearLayout linearLayout= (LinearLayout)viewStub.inflate();
if (linearLayout!= null){ //已经加载成功
}

merge

merge它可以删减多余的层级,优化UI。
例如你的主布局文件是垂直的LinearLayout,这时使用includemy_layout.xml 引入进来。
新布局也是垂直的LinearLayout,那么这个新的LinearLayout就没有任何意义了。使用的话反而增加反应时间。这时可以使用<merge/>标签优化。

merge 原理就是在解析xml时候,如果是 <merge/> 标签,那么直接将其中的子元素添加到merge 标签parent中,这样就保证了不会引入额外的层级

示例如下 :

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"> <Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Button"/><TextViewandroid:id="@+id/textView"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="TextView"/>
</merge>

作者:Pan_大宝
链接:http://www.jianshu.com/p/354fb8a42ad8
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

include、ViewStub、merge优化布局标签相关推荐

  1. Android布局优化之ViewStub、include、merge使用与源码分析

    在开发中UI布局是我们都会遇到的问题,随着UI越来越多,布局的重复性.复杂度也会随之增长.Android官方给了几个优化的方法,但是网络上的资料基本上都是对官方资料的翻译,这些资料都特别的简单,经常会 ...

  2. 布局与控件(五)-Toast吐司与布局的抽象标签merge include ViewStub

    更新时间 修改意见 2016-08-02 陈敏 第5节 Toast 5.1 使用效果 Toast用来向用户弹出一个提示框,然后自动消失,就像这样, 面包机烤好面包后,就腾的一下把面包从面包机里弹出来. ...

  3. Android抽象布局——include、merge 、ViewStub

    在布局优化中,Androi的官方提到了这三种布局<include />.<merge />.<ViewStub />,并介绍了这三种布局各有的优势,下面也是简单说一 ...

  4. android layout include merge,Android 布局优化之include与merge

    Android 官方提供了三个用来优化布局的标签,分别是include.merge与ViewStub,其中ViewStub是动态加载视图到内存,大家可以查阅:Android UI布局优化之ViewSt ...

  5. Android layout 优化:使用include和merge 标签

    使用<include /> 标签来重用layout代码 如果在一个项目中需要用到相同的布局设计,可以通过<include /> 标签来重用layout代码,该标签在androi ...

  6. 在android布局中使用include和merge标签

    在我们开发Android布局时,经常会有很多的布局是相同的,这个时候我们可以通过<include/>和<merge/>标签实现将复杂的布局包含在需要的布局中,减少重复代码的编写 ...

  7. Android 优化布局层次结构

    前面介绍过使用HierarchyViewer和Android lint来优化我们的程序,这一篇算是总结性的,借助一个小例子来说用怎么优化应用布局.这个例子是android官网给出的,作者也当一把翻译. ...

  8. 站长探讨说说之SEO文章关键词精准优化布局

    SEO文章关键词精准优化布局 对于SEO人员来说,写文章,那是必经之路,都知道文章好写,但是想要写出一篇高质量,便于SEO的文章,就不是那么简单的事情了,下面由SEO网站优化为大家提出几点SEO文章关 ...

  9. 如何挑选与优化布局关键词

    关键词优化是让网站目标关键词在某个搜索引擎上得到更好的排名,让更多的用户都能快速的查找到自己的网站关键词.关键词是优化战略的重要组成部分,我们必须先确认好我们推广的关键词,才能开始做网站的标题与描述等 ...

最新文章

  1. RYU控制器的学习笔记(二)
  2. [Hibernate系列—] 2. 创建SessionFactory 与 Session
  3. Android入门(十二)SQLite事务、升级数据库
  4. 通过AOP控制事务的案例
  5. [妙味DOM]第五课:事件深入应用
  6. 基于Tensorflow + Opencv 实现CNN自定义图像分类
  7. MySQL 常用函数大全
  8. 轻松构建并发送ICMP数据包
  9. Unity-Animator深入系列---测试CrossFade和CrossFadeInFixedTime
  10. 执行脚本错误:-bash: ./start.sh: /bin/bash^M: bad interpreter: No such file or directory
  11. 关于使用联盟链建立本地p2p可插电式混合动力车的智能电网交易的想法
  12. 关于yd ui 移动端自适应的方案
  13. 山东某商业银行社会招聘
  14. FISCO BCOS迎来开源智能合约编程语言Liquid
  15. VS2017+OpenCV3.4.1
  16. 帕慕克给我上的一堂编程学习课
  17. 《牧羊少年奇幻之旅》读书笔记
  18. 网页转pdf乱码问题,楷体部分出乱码
  19. CSS带箭头的提示框实现
  20. mtk 6762 modem编译

热门文章

  1. edHat linux光盘引导,Red Hat Linux 9光盘启动安装过程
  2. linux中分区乱了,找到了linux分区顺序错乱修复方法
  3. 2.5e2.0是合法的c语言常量,二级考试C语言程序设计.ppt
  4. 文本编辑器创建工具栏
  5. python中数字应该用什么表示_Python
  6. Rxjava 优雅的实现短信验证码发送
  7. 虚拟主机跟php,php虚拟主机和服务器(云服务器跟虚拟主机)
  8. Linux下CMake简明教程(二)同一目录下多个源文件
  9. javase开发工具包中的什么命令负责运行应用程序_JavaSE之编程概述
  10. Leetcode 226. 翻转二叉树 (每日一题 20210819)