首页 > 代码库 > Android攻城狮布局优化

Android攻城狮布局优化

Android常用的布局样式
1.LinearLayout(线性布局) 线性的 垂直的 水平的
2.RelativeLayout(相对布局) 最灵活的
3.TableLayout(表格布局) 现在被 GridView代替
4.AbsoluteLayout(绝对布局) 已淘汰
5.FrameLayout(帧布局) 布局叠加时使用

现在基本使用线性布局和相对布局,特殊情况会使用帧布局(视频暂停、缓冲文件等)。

Android布局原则
1.尽量多使用LinearLayout(线性布局)和RelativeLayout(相对布局),不要使用AbsoluteLayout(绝对布局)
2.在布局层次相同的情况下,建议使用LinearLayout代替RelativeLayout,因为这时LinearLayout的性能比RelativeLayout要好一些。
3.将可复用的组件抽取出来并通过include标签使用
4.使用ViewStub标签来加载一些不常用的布局
5.使用merge标签减少布局的嵌套层次。
灵活使用后面三条原则,将极大优化项目的布局。
----------------------------------
< include />的使用
作用:将公用的组件抽取出来单独放到一个xml文件中,然后使用include标签导入公用布局。
效果:提高UI的制作和复用效率,也能保证制作的UI布局更加规整、可维护。




本节编程步骤:
1. 创建相对布局 common_title.xml。同时修改 AndroidManifest.xml的application的主题样式属性,改做:android:theme="@android:style/Theme.Light.NoTitleBar"
2. 在 common_title.xml 中添加3个 TextView,TextViwe的属性分别设置为左对齐(layout_alignParentStart="true")、居中(layout_centerInParent="true")和右对齐(layout_alignParentEnd="true")。同时都设置为垂直居中(layout_centerVertical="true"),另外修改RelativeLayout的属性layout_height="wrap_content",这样就做好标题栏了。
3.在main.xml中添加<include>标签,把common_title.xml引入到这里:
<include
    layout="@layout/common_title"
/>
使用include,就相当于把common_title加入到main.xml,成为main.xml的一部分。所以可以在 MainActivity 中直接使用findViewById(R.id.XXX)找到common_title里面的控件。

使用merge合并UI布局
作用:合并UI布局,使用该标签能降低UI布局的嵌套层次。
场景(1):布局根结点是FrameLayout且不需要设置background或者padding等属性,可以用merge代替;
场景(2):某布局作为子布局被其他布局include时,使用merge当作该布局的顶结点,这样在被引入时顶结点会自动被忽略。
关于第二点,比如说我们新建一个 common_progressbar.xml 文件,根布局是LinearLayout,里面设置ProgressBar和TextView.。本来LinearLayout采用的是垂直布局,ProgressBar和TextView不会叠加,但在 main.xml 文件中添加 FrameLayout子布局,并在里面使用 include 添加 common_progressbar.xml,并且修改common_progressbar.xml的根布局,用merge代替LinearLayout,结果就出现 ProgressBar和TextView 叠加的效果,说明被include进来的根布局被自动忽略了。
其实也同样证明了第一点。正因为是在FrameLayout里面使用了include,才能顺利地用merge代替LinearLayout。
使用ViewStub惰性加载
作用:ViewStub标签同include标签一样可以用来引入一个外部布局,不同的是,ViewStub引入的布局默认不会扩张,既不会占用显示也不会占用位置,从而在解析layout时节省cpu和内存。
所以,可以人为地控制什么时候去加载ViewStub的内容。
ViewStub通常作为一种优化,只有触发某种事件的时候才会显示内容,才会去占用cpu和内存。
----------------------
这里我们通过使用按钮来实现ViewStub惰性加载。
1. 首先新建一个 common_text文件,只添加TextView控件。
2. 在 main.xml 文件中添加 Button 和 ViewStub,其中ViewStub添加属性android:layout="@layout/common_text",完成布局的添加。
3. 在 MainActiivity中创建和初始化Button和ViewStub。对Button添加监听器,监听点击事件。重写onclick()方法:在里面添加一句:viewStub.inflate();//令惰性加载ViewStub加载布局
-----------------
不使用ViewStub也可以隐藏内容:比如说,TextView就有visibility属性,设置visibility="gone"就不会显示内容。可以设置个按钮监听器,当点击此按钮后,就修改visibility="visible"就能显示内容。
----------------------
摘自评论区:
viewstub显示出来最好不要用inflate();最好用setVisibility(viewstub.VISIBLE)显示和用setVisibility(viewstub.GONE)隐藏,会少些麻烦。但是也有缺点,就是占用内存。

另外,那个“显示隐藏内容按钮”,点一次,出现“隐藏内容”,再点第二次,程序直接闪退。原因:对ViewStub的inflate操作只能进行一次,因为inflate的时候是将其指向的布局文件解析inflate并替换掉当前ViewStub本身(由此体现出了ViewStub“占位符”性质),一旦替换后,此时原来的布局文件中就没有ViewStub控件了,因此,如果多次对ViewStub进行infalte,会出现错误信息:ViewStub must have a non-null ViewGroup viewParent。



技术分享

 










Android攻城狮布局优化