写点什么

【中级—,android 项目驱动式开发教程

用户头像
Android架构
关注
发布于: 2021 年 11 月 05 日

一、<include/>

标签在布局优化中是使用最多的一个标签了,它就是为了解决重复定义布局的问题。标签就相当于 C、C++中的 include 头文件一样,把一些常用的底层的 API 封装起来,需要的时候引入即可。在一些开源的 J2EE 中许多 XML 配置文件也都会使用标签,将多个配置文件组合成为一个更为复杂的配置文件,如最常见的 S2SH。


在以前 Android 开发中,由于 ActionBar 设计上的不统一以及兼容性问题,所以很多应用都自定义了一套自己的标题栏 titlebar。标题栏我们知道在应用的每个界面几乎都会用到,在这里可以作为一个很好的示例来解释标签的使用。


下面是一个自定义的 titlebar 文件:


<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/titlebar_bg">


<ImageView an


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


droid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/gafricalogo" /></FrameLayout>


在应用中使用 titlebar 布局文件,我们通过标签,布局文件如下:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/app_bg"android:gravity="center_horizontal">


<include layout="@layout/titlebar"/>


<TextView android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/hello"android:padding="10dp" />


...


</LinearLayout>


在标签中可以覆盖导入的布局文件 root 布局的布局属性(如 layout_*属性)。


布局示例如下:


<include android:id="@+id/news_title"android:layout_width="match_parent"android:layout_height="match_parent"layout="@layout/title"/>


如果想使用标签覆盖嵌入布局 root 布局属性,必须同时覆盖 layout_height 和 layout_width 属性,否则会直接报编译时语法错误。


Layout parameter layout_height ignored unless layout_width is also specified on tag


如果标签已经定义了 id,而嵌入布局文件的 root 布局文件也定义了 id,标签的 id 会覆盖掉嵌入布局文件 root 的 id,如果 include 标签没有定义 id 则会使用嵌入文件 root 的 id。

二、<merge/>

标签都是与标签组合使用的,它的作用就是可以有效减少 View 树的层次来优化布局。


下面通过一个简单的示例探讨一下标签的使用,下面是嵌套布局的 layout_text.xml 文件:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><TextViewandroid:id="@+id/textView"android:layout_width="match_parent"android:text="Hello World!"android:layout_height="match_parent" /></LinearLayout>


一个线性布局中嵌套一个文本视图,主布局如下:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/layout_wrap"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" >


<includeandroid:id="@+id/layout_import"android:layout_width="match_parent"android:layout_height="match_parent"layout="@layout/layout_text" />


</LinearLayout>


通过 hierarchyviewer 我们可以看到主布局 View 树的部分层级结构如下图:



现在讲嵌套布局跟布局标签更改为,merge_text.xml 布局文件如下:


<merge xmlns:android="http://schemas.android.com/apk/res/android" >


<TextViewandroid:id="@+id/textView"android:layout_width="match_parent"android:layout_height="match_parent"android:text="Hello World!"/>


</merge>


然后将主布局标签中的 layout 更改为 merge_text.xml,运行后重新截图如下:



对比截图就可以发现上面的四层结构,现在已经是三层结构了。当我们使用标签的时候,系统会自动忽略 merge 层级,而把 TextView 直接放置与平级。


标签在使用的时候需要特别注意布局的类型,例如我的标签中包含的是一个 LinearLayout 布局视图,布局中的元素是线性排列的,如果嵌套进主布局时,include 标签父布局时 FrameLayout,这种方式嵌套肯定会出问题的,merge 中元素会按照 FrameLayout 布局方式显示。所以在使用的时候,标签虽然可以减少布局层级,但是它的限制也不可小觑。


只能作为 XML 布局的根标签使用。当 Inflate 以开头的布局文件时,必须指定一个父 ViewGroup,并且必须设定 attachToRoot 为 true。


View android.view.LayoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot)


root 不可少,attachToRoot 必须为 true。

三、ViewStub

在开发过程中,经常会遇到这样一种情况,有些布局很复杂但是却很少使用。例如条目详情、进度条标识或者未读消息等,这些情况如果在一开始初始化,虽然设置可见性View.GONE,但是在 Inflate 的时候 View 仍然会被 Inflate,仍然会创建对象,由于这些布局又想到复杂,所以会很消耗系统资源。


ViewStub 就是为了解决上面问题的,ViewStub 是一个轻量级的 View,它一个看不见的,不占布局位置,占用资源非常小的控件。

定义 ViewStub 布局文件

下面是一个 ViewStub 布局文件:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/layout_wrap"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" >


<ViewStubandroid:id="@+id/stub_image"android:layout_width="match_parent"android:layout_height="wrap_content"android:inflatedId="@+id/image_import"android:layout="@layout/layout_image" />


<ViewStubandroid:id="@+id/stub_text"android:layout_width="match_parent"

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
【中级—,android项目驱动式开发教程