Android攻城狮布局优化

【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攻城狮布局优化

文章图片

 











    推荐阅读