Android 布局巧用之include、merge、ViewStub

taixiang 2018-06-25 原文

Android 布局巧用之include、merge、ViewStub

原文链接:https://mp.weixin.qq.com/s/bTA2gztUzqvqER2rz56RRQ

相信大家经常听到includemergeViewStub这样的标签,官方也提到这三种布局可用于布局的优化。今天就介绍下这三种布局的使用,记录下来,便于后续app中的使用。

include布局重用

app开发过程中,会遇到不同页面里有相同的布局,这时我们可以将这些通用的布局提取出来到一个单独的layout文件里,再使用<include>标签引入到相应的页面布局文件里,主要通过includelayout属性引用。
举个栗子
include的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这里是来自include布局" />

</RelativeLayout>

activity的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="以下的内容来自include标签" />

    <include
        android:id="@+id/container"
        layout="@layout/include_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tv"
        android:layout_marginTop="10dp" />

</RelativeLayout>

这个标签在日常工作使用还是很常见的。这里有几点需要注意下:
1、如果给include标签 和 include所加载的布局 都添加id的话,那么id要保持一致,如例子中都是container,否则是在代码中获取不到RelativeLayout容器的。 当然我们可以避免这样的问题,只需要给其中一项添加id属性就可以。

2、include布局里元素的id 要和 include所在页面布局里的其他元素id 不同,如例子中的两个textview,如果把id设置相同了,程序运行起来并不会报错,但是textview的赋值只会赋值给其中的一个。

3、如果需要给include标签设置位置属性的话,如例子中的layout_belowlayout_marginTop,这时候 必须 同时设置include标签的宽高属性layout_widthlayout_height,否则编译器是会报错的。一般情况不需要设置include的其他属性,直接加载布局文件 <include layout="@layout/...."/>

4、布局中可以包含两个相同的include标签,如下代码所示 两个include都加载layout="@layout/include_layout"

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="以下的内容来自include标签" />

    <include
        android:id="@+id/container"
        layout="@layout/include_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tv"
        android:layout_marginTop="10dp" />

    <include
        android:id="@+id/container2"
        layout="@layout/include_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="80dp" />

</RelativeLayout>

可以设置不同include的id属性,引用的时候如下可以正常显示:

View view = findViewById(R.id.container2);
TextView textView = view.findViewById(R.id.tv);
textView.setText("这里是来自 第二个 include布局");

merge减少视图层级

merge标签可用于减少视图层级来优化布局,可以配合include使用,如果include标签的父布局 和 include布局的根容器是相同类型的,那么根容器的可以使用merge代替。
页面布局

<?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">

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="以下的内容不是来自merge标签" />

    <include
        layout="@layout/merge_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp" />

</LinearLayout>

先看没有使用merge的:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这里是不是来自merge布局" />

</LinearLayout>

看下view层的结构:

再看使用了merge的:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这里是来自merge布局" />

</merge>

view层结构:

可以看到对比,减少了一层的LinearLayout的嵌套,需要注意的是使用merge的布局,在include的标签设置距离属性没有生效,可以将一些间距属性设置到include布局里元素上,具体看项目需求使用。

ViewStub按需加载

按需加载 顾名思义需要的时候再去加载,不需要的时候可以不用加载,节约内存使用。通常情况我们会使用setVisibility方法来控制视图的显示和隐藏,但是这种情况视图已经加载了。
比如app中页面里某个布局只需要在特定的情况下才显示,其余情况下可以不用加载显示,这时候可以使用ViewStub
layout属性是需要加载布局

<?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">

    <ViewStub
        android:id="@+id/viewstub"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout="@layout/viewstub_layout" />

</LinearLayout>

需要注意的是 ViewStubinflate()方法只能被调用一次,一旦调用后,ViewStub将从视图中移除,被对应的layout布局取代,同时会保留ViewStub上设置的属性效果。

ViewStub viewstub = findViewById(R.id.viewstub);
viewstub.inflate();

这篇关于includemergeViewStub的使用就介绍到这里了,具体使用情况还得视项目而定。

最后附上github地址https://github.com/taixiang/include

欢迎关注我的博客:https://blog.manjiexiang.cn/
更多精彩欢迎关注微信号:春风十里不如认识你
image.png

发表于 2018-06-25 22:32 程序猿tx 阅读() 评论() 编辑 收藏

 

版权声明:本文为taixiang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/taixiang/p/9221258.html

Android 布局巧用之include、merge、ViewStub的更多相关文章

  1. RecyclerView android

    RecyclerView是用来替代ListView、GridView的一个牛掰的控件。用起来更灵活,还能实现线 […]...

  2. Android WebView存在跨域访问漏洞(CNVD-2017-36682)介绍及解决

      Android WebView存在跨域访问漏洞(CNVD-2017-36682)。攻击者利用该漏洞,可远程 […]...

  3. Android 手机摄像头做 电脑 PC 视频摄像头 聊天

    Android 手机摄像头做 电脑 PC 视频摄像头 聊天 2011-04-17 22:55  闫妍  阅读( […]...

  4. Android UsageStatsService(应用使用统计服务)的学习与调研

    一. 简介 UsageStatsService是一个系统服务,其主要通过AMS等,来监测并记录各个应用的使用数 […]...

  5. Android studio安装配置

    环境 windows X64位系统,jdk8,android studio2.2.3 下载android st […]...

  6. [Android]自己动手做个拼图游戏

    目标 在做这个游戏之前,我们先定一些小目标列出来,一个一个的解决,这样,一个小游戏就不知不觉的完成啦。我们的目 […]...

  7. android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)

    一、摄像头工作原理 上一篇我们讲了摄像头模组的组成,工作原理,做为一种了解。下面我们析摄像头从寄存器角度是怎么 […]...

  8. Android(常用)主流UI开源库整理

    这几天刚做完一个项目。。有点空余时间,就想着吧这一两年做的项目中的UI界面用到的一些库整理一下。后来想了一下, […]...

随机推荐

  1. 第26篇-虚拟机对象操作指令之putstatic

    第26篇-虚拟机对象操作指令之putstatic 之前已经介绍了getstatic与getfield指令的汇编 […]...

  2. 裸辞到杭州的经历分享

    目录 1.背景 2 辞职 & 裸辞 2.1 谈谈辞职 2.3 裸辞 & 裸辞利弊 2.4 求职 […]...

  3. youtube下载工具

    Youtube是一个全球性的视频分享网站,其种类之多,内容之丰富,是大家有目共睹的。特别是原创视频更是多不胜数 […]...

  4. 用阻塞队列实现一个生产者消费者模型?synchronized和lock有什么区别? WEB与游戏开发的一些区别 Flask(5)- 动态路由 『无为则无心』Python函数 — 25、Python中的函数 http连接复用进化论 Git常用命令超级详细(全网最详细) Android系统“资源调度框架” 进来偷学一招,数据归档二三事儿 安卓手机改造服务器——基本环境配置(CentOS7 arm32) [Kick Start] 2021 Round B 对抗样本综述(一) 海量数据Excel报表利器——Eas

    多线程当中的阻塞队列 主要实现类有 ArrayBlockingQueue是一个基于数组结构的有界阻塞队列,此队 […]...

  5. 现代前端框架和 jQuery 库的比较

    现代前端框架和传统 jQuery 库的⽐比较 现代前端框架代表(angular, vue, react都是基于 […]...

  6. mysql数据库存储过程参数接收表情符号

    1 DROP PROCEDURE IF EXISTS `Ai_Promote`.`APWXUserAdd` 2 […]...

  7. 目标检测 1 : 目标检测中的Anchor详解

    咸鱼了半年,年底了,把这半年做的关于目标的检测的内容总结下。 本文主要有两部分: 目标检测中的边框表示 Anc […]...

  8. 【转】常用数据库默认端口和连接方式总结

    常用数据库默认端口和连接方式总结   转:各种数据库默认端口总结,防止连接失效,特备份。 Oracle dri […]...

展开目录

目录导航