首页 > 代码库 > 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攻城狮布局优化
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。