百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Android include标签的使用注意事项

bigegpt 2024-08-07 17:49 4 浏览

<inlcude>标签

在开发Android布局时,常将一些通用的视图提取到一个单独的layout文件中,然后使用<include>标签在需要使用的其他layout布局文件中加载进来,比如App导航栏等。这样,便于对相同视图内容进行统一的控制管理,提高布局重用性。然而,使用<include>标签总有一些值得我们注意的地方。

根容器id与include id必须相同

如果我们给include所加载的layout布局的根容器设置了id属性,也在include标签中设置了id属性,同时需要在代码中获取根容器的控件对象时,一定要将这两个id设置相同的名称!否则,将获取不到根容器对象,即为null。举个例子:


我们将应用中的Toolbar提取到一个include_toolbar.xml文件中,并设置了Toolbar设置了id属性:





然后在其他布局文件activity_main.xml中使用include标签加载上述Toolbar视图,同时由于相对布局的需要而将include标签设置了相同值的id属性:





最后在代码文件MainActivity.java中获取Toolbar对象:



宽高属性与其他属性的联合使用

在使用include标签时,除了使用layout属性加载布局文件时,一般不需要设置其他属性了,比如:





但有时为了布局的需要,仍要使用诸如layout_margin等除id之外的其他属性,这时就要注意,为了使这些其他属性起作用,必须同时设置include标签的宽高属性,如:



<merge>标签

<merge>标签存在的意义是帮助<include>标签排除多余的一层ViewGroup容器,减少view hierarchy的结构,提升UI performance。Developers官网举了一个很好的例子,大家可以自行查看一下,总结其意思就是,在主界面中,<include>标签的parent ViewGroup与包含的layout根容器ViewGroup是相同的类型,那么则可以将包含的layout根容器ViewGroup使用<merge>标签代替,从而减少一层ViewGroup的嵌套,从而提升UI性能渲染。举个例子就是:



然后再在其他界面中使用<include>标签加载重用布局文件即可。

ViewStub控件

android.view.ViewStub也可以用来加载布局文件,但与include标签完全不同。ViewStub是一个不可见的View类,用于在运行时按需懒加载资源,只有在代码中调用了viewStub.inflate()或者viewStub.setVisible(View.visible)方法时才内容才变得可见。这里需要注意的一点是,当ViewStub被inflate到parent时,ViewStub就被remove掉了,即当前view hierarchy中不再存在ViewStub,而是使用对应的layout视图代替。ViewStub有几个属性和方法值得说明一下:

  • android:layout属性
    加载包含的layout布局文件;
  • android:inflatedId属性
    重写包含的layout布局文件的根容器id;
  • inflate()方法
    setVisible(int)方法作用类似,都可以使内容得以显示,只是inflate()会返回一个View对象,避免了额外使用findViewById()方法获取layout视图对象。


举个例子说明一下,按需加载的viewstub_content.xml内容如下(这里只是个例子,只有一个TextView,实际使用中一定是一个复杂的布局才用得上ViewStub):





Activity界面布局文件activity_main.xml内容如下,只有一个Button按钮和ViewStub控件:





对应的java代码如下,点击按钮显示ViewStub的内容:





点击按钮,即可显示ViewStub的内容。我们用Hierarchy View观察一下视图层次的情况,当Activity初始化时,视图结构如下:



可以看到,当前view hierarchy中存在的是ViewStub而不是包含的layout布局。点击一下按钮,显示内容,再看一下:





ViewStub已经remove掉了,而包含的layout布局加入到当前view hierarchy中,即无法使用findViewById()方法获取ViewStub的引用。


所以,<include>标签与ViewStub完全不是同一个概念,ViewStub自带懒加载特性,可以理解为一个轻量级的View,自身占用资源较小,在UI初始化时所对应的layout布局视图不占用系统资源,从而可以加快当前界面的渲染过程,相比使用普通的view.setVisible(int)方法,性能体验提高不少,而<include>标签则只是用于提高布局的重用性,使用场景大有不同。

相关推荐

php-fpm的配置和优化

目录概述php-fpm配置php-fpm进程优化配置慢日志查询配置php7进阶到架构师相关阅读概述这是关于php进阶到架构之php7核心技术与实战学习的系列课程:php-fpm的配置和优化学习目标:理...

成功安装 Magento2.4.3最新版教程「技术干货」

外贸独立站设计公司xingbell.com经过多次的反复实验,最新版的magento2.4.3在oneinstack的环境下的详细安装教程如下:一.vps系统:LinuxCentOS7.7.19...

十分钟让你学会LNMP架构负载均衡

业务架构、应用架构、数据架构和技术架构一、几个基本概念1、pv值pv值(pageviews):页面的浏览量概念:一个网站的所有页面,在一天内,被浏览的总次数。(大型网站通常是上千万的级别)2、u...

php从远程URL获取(mp4 mp3)音视频的流媒体数据

/***从远程URL中获取媒体(如mp4mp3)的内容*@parammixed$file_url*@parammixed$media_type...

Zabbix5.0安装部署

全盘展示运行状态,减轻运维人员的重复性工作量,提高系统排错速度,加速运维知识学习积累。1.png1、环境安装关闭SELinux并重启系统2.png安装httpd、mariadb、php运行yum-...

php 常见配置详解

以下是PHP常见的配置项及其含义:error_reporting:设置错误报告级别,可以控制PHP显示哪些错误。例如,设置为E_ALL将显示所有错误,而设置为0将禁止显示任何错误。displa...

实践分享|基于基石智算 DeepSeek API + WordPress 插件自动生成访客回复

基石智算举办的DeepSeek案例大赛汇集了不少基于CoresHubDeepSeekAPI服务或模型部署服务的精彩实践。本次我们将分享个人实践:通过DeepSeekAPI+Word...

如何在Eclipse中搭建Zabbix源码的调试和开发环境

Zabbix是一款非常优秀的企业级软件,被设计用于对数万台服务器、虚拟机和网络设备的数百万个监控项进行实时监控。Zabbix是开放源码和免费的,这就意味着当出现bug时,我们可以很方便地通过调试源码来...

MySQL自我保护参数

#头条创作挑战赛#之前(MySQL自我保护工具--pt-kill)提到用pt-kill工具来kill相关的会话,来达到保护数据库的目的,本文再通过修改数据库参数的方式达到阻断长时间运行的SQL的目...

Python闭包深度解析:掌握数据封装的高级技巧

闭包作为Python高级编程特性之一,为开发者提供了一种优雅的方式来实现数据封装和状态保持。这一概念源于函数式编程理论,在现代Python开发中发挥着重要作用。理解和掌握闭包的使用不仅能够提升代码的表...

Java服务网格故障注入与熔断实战

在分布式系统的高可用性挑战中,服务网格的故障注入与熔断机制是检验系统韧性的终极试金石。以下是10道逐步升级的"地狱关卡",每个关卡都对应真实生产环境中可能遇到的致命场景,并附具体场景示...

MySQL数据库性能优化全攻略:程序员必知的七大核心策略

作为程序员,我们每天都要与数据库打交道。当系统用户量突破百万级时,数据库往往成为性能瓶颈的首要怀疑对象。本文将深入探讨MySQL优化的七大核心策略,并提供可直接落地的优化方案,助您构建高效稳定的数据库...

如何在 Windows 11 上使用单个命令安装 XAMPP

XAMPP是一种广泛使用的软件,用于在Windows操作系统上快速运行LAMP服务器包,包括Windows11。尽管LAMP通常用于Linux系统,但XAMPP并不使用Li...

uTorrent怎样将bt种子转换为磁力

如何用uTorrent把BT种子转为磁力链接?以下方法希望能帮到你。1、在uTorrent窗口里,点击工具栏的按钮,所示。2、在打开窗口里,选取要转为磁力的种子文件,然后点击打开按钮,参照图示操作...

支持向量机SVM 分类和回归的实例

支持向量机(SupportVectorMachine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他...