在activity被初始化后。执行到onCreate后, 会执行setContentView()。这个哪怕是个初学者也会知道。
但这里有一个小问题:如果layout的嵌套过于复杂,会出现绘制过度或者加载变慢等问题。那就需要对layout进行优化。
那么优化方式多种多样,
比如约束布局 - ConstraintLayout:
ConstraintLayout 是一个ViewGroup,可以在Api9以上的Android系统使用它,它的出现主要是为了解决布局嵌套过多的问题,以灵活的方式定位和调整小部件。从 Android Studio 2.3 起,官方的模板默认使用 ConstraintLayout。
当然这里对 ConstraintLayout 不做介绍。不会的同学请自行百度,今天要说的是 < merge /> 和 < ViewStub />。废话不多。开始正文:
之一:< merge />
应用场景:比如在layout中没有嵌套到第三层。也就是只有父布局ViewGroup和下面的view,再无更深的嵌套,如图:
这时候就可以使用< merge /> :
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center_horizontal"
android:src="@drawable/ic_launcher_background" />
</merge>
当然,使用任何一个viewGroup都可以实现,但是,但是,但是:
这就表示当有任何一个地方去include这个布局时,会将merge标签内包含的内容直接填充到include的位置,不会再添加任何额外的布局结构
用人话说就是:节省性能。
之一:< ViewStub />
ViewStub是一个轻量级的view,看不见,不占用布局位置。占用资源也非常的小。只有在Inflate的时候才会初始化,即延迟加载。
特点:
- 只能Inflate一次,之后ViewStub对象就会被值为空。
- 只能Inflate一个布局文件,不支持具体的view(可以把view单独抽离为 layout文件,根据情况结合merge 使用):
使用如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<ViewStub
android:id="@+id/vs"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout="@layout/test1" />
</LinearLayout>
代码中的test1即是延迟加载的layout。这里就不展示了。
加载方法:
vs?.inflate()
本篇只做简单的特效介绍和使用方法。具体更深的请自行百度。
END