5. 使用结合Hierarchy Viewer减少布局嵌套
2018-03-29 本文已影响74人
真胖大海
一.使用Hierarchy Viewer减少布局层级
1.1直接删除多余的布局
场景:发现LinearLayout下只有一个SmartRefreshLayout布局,所以可以直接将LinearLayout这个布局去掉
优化前 优化后
1.2使用merge标签减少多余的布局
原理:系统会忽略merge标签,将merge标签下的视图直接放入include所在的布局中
场景 :
外层是一个vertical的LinearLayout,include的布局文件的根布局也是一个个vertical的LinearLayout,此时就可以将include的布局文件的根布局改成merge
setVisibility(int visibility)
When visibility is set to VISIBLE or INVISIBLE, inflate() is invoked and this StubbedView is replaced in its parent by the inflated layout resource.
<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"/>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android">
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/add"/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/delete"/>
</LinearLayout>
改成
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/add"/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/delete"/>
</merge>
1.3 使用RelativeLayout/ConstraintLayout减少UI层次
constraint-layout使用介绍
constraint-layout API
1.4 使用ViewStub实现懒加载
ViewStub
注意:一个控件为GONE或者INVIVILE,即使它不被绘制,也会创建对象,初始化,占用资源
一.作用
ViewStub是一个不可见的,大小为0的视图,当ViewStub被设置为View.VISIBLE或调用inflate时,ViewStub会用inflate的视图替换自己在父容器中的位置。
二.使用
<ViewStub
android:id="@+id/stub" //ViewStub的id
android:inflatedId="@+id/subTree" //可以使用此属性替换待填充的布局的根视图的id
android:layout="@layout/mySubTree" //待填充的布局
android:layout_width="120dip" //必须
android:layout_height="40dip" //必须
/>
//使用inflate()与setVisibility(View.VISIBLE)都可以使视图填充,但是inflate可以获取待填充视图的对象,便于后续操作
ViewStub stub = findViewById(R.id.stub);
View inflated = stub.inflate();
//或者 stub.setVisibility(View.VISIBLE)
三.使用场景
一个页面可能有一个布局在某些情况下才显示,有些情况下不显示。此时就可以使用ViewStub,在需要时将布局加载出来而是在页面初始时就将布局全部加载出来
四.例子
-
未使用ViewStub时,即使无评论,无评论的布局也被填充了
未使用ViewStub -
ViewStub时,无评论时,无评论布局被填充;有评论时,无评论布局不被填充
使用ViewStub 有评论