Android布局优化问题

原创 2016年05月30日 12:29:05

在进行Android应用开发时,界面优化问题至关重要,它严重影响了应用的加载效率,今天我简单谈论一下Android开发中UI界面的优化问题。


添加到应用中的每一个布局和控件都需要经过初始化、排列位置、绘制三个过程。


通常遇到的问题:比如说,使用嵌套的线性布局可能导致你的布局层级变得十分冗余。此外,如果在嵌套的线性布局中使用了 layout_weight 参数的话,那么他的每一个子 view 都需要被重新测量两次。特别是当他们被用在 ListView 和 GridView 中时,他们会被反复的测量。


可以使用Hierarchy Viewer 以及 Layoutopt来检测(可以查看UI生成树)和优化我们布局,对于工具的具体用法在这里不细说了。

 

总的来说,要想优化界面,通常的可以使用的方法是:

1、 优化布局层次,尽可能使界面扁平化。

通过修改ui布局来减少界面嵌套层次。例如:多使用相对布局来设计界面。

2、 使用标签。

<merge/>

当LayoutInflater遇到<merge/>标签时,它会跳过它,并将<merge />内的元素添加到<merge />的父元素里。

<merge/>只能作为XML布局的根标签使用,只能替换<FrameLayout/>

当Inflate以<merge/>开头的布局文件时,必须指定一个父ViewGroup,并且必须设定attachToRoot为true。参看LayoutInflater.inflate(int resource, ViewGroup root, booleanattachToRoot)。

 

<include/>

标签内不能设置RelativeLayout属性,如android:layout_alignParentBottom,因为不起作用

include标签内设置id属性后(android:id),其引用的布局layout内的id属性就不起作用了,怀疑是其引用的layout外层包裹了一层include标签或者是覆盖了其内的属性id

如果没有include标签,所有布局代码都写在一个xml文件中,界面会显得很冗余,可读性很差。而且界面加载的时候是按照顺序加载的,前面的布局不能调用其后面的布局id。而采用include后,一个include中可以引用其后的include中的布局id属性


3、按需加载View视图。

使用< ViewStub />标签来加载一些不常用的布局。

    ViewStub:可以理解成一个非常轻量级的View,有着自己的属性及特定的方法。当ViewStub使用在布局文件中时,当程序inflate布局文件时,ViewStub本身也会被解析,且占据内存控件,但是与其他控件相比,主要区别体现在以下几点:

1.当布局文件inflate时,ViewStub控件虽然也占据内存,但是相相比于其他控件,ViewStub所占内存很小;

2.布局文件inflate时,ViewStub主要是作为一个“占位符”的性质,放置于view tree中,且ViewStub本身是不可见的。ViewStub中有一个layout属性,指向ViewStub本身可能被替换掉的布局文件,在一定时机时,通过viewStub.inflate()完成此过程;

3.ViewStub本身是不可见的,对ViewStub setVisibility(..)与其他控件不一样,ViewStub的setVisibility成View.VISIBLE或INVISIBLE如果是首次使用,都会自动inflate其指向的布局文件,并替换ViewStub本身,再次使用则是相当于对其指向的布局文件设置可见性。

        

上面简单谈论了一下布局优化的方法和部分方法的简介,作为概述,没有深入研究。若有不足之处,还请批评指正。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

android xml 布局像素问题

  • 2014-05-07 15:36
  • 52KB
  • 下载

android gridview item切换布局Timer问题

最近做了一个小demo,主要功能是当长按一个item的时候拖动到指定区域3秒后,可以切换到另一个页面。当用到timer 控件的时候问题发生了,当我拖动到指定区域后,可能马上就显示另外一个布局了。 pr...

Android:可滑动展开的侧边栏在功能区中切换有EditText的布局时自动展开的问题解决

解决侧边栏无故展开的问题

布局及设计问题优化方法

  • 2011-03-21 09:00
  • 472KB
  • 下载

Android ViewGroup 子布局Layout id重名导致某些设备出现中断问题

最近看了一下友盟的异常日志,发现很多类型转换异常导致程序中断,看了代码,感觉这些错误也挺莫名其妙的,看不到直接引起异常的代码,唯一可疑的是最近在某一子Layout调整了@+id/loadingLayo...

Android RadioGroup中横向、竖向布局RadioButton的问题

RadioGroup默认的横向android:orientation="horizontal"、竖向布局android:orientation="vertical",无法设置每行显示的个数,只能全部横...
  • AMinfo
  • AMinfo
  • 2012-05-11 18:13
  • 51310
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)