Android 布局优化

1、<include>

合理使用include标签。

优点:增加对公共布局的复用

缺点:可能会产生多余的布局嵌套

2、<merge>

优点:<merge>标签是作为<include>标签的一种辅助扩展来使用的,它的主要作用是为了防止在引用布局文件时产生多余的布局嵌套。大家都知道,Android去解析和展示一个布局是需要消耗时间的,布局嵌套的越多,那么解析起来就越耗时,性能也就越差,因此我们在编写布局文件时应该让嵌套的层数越少越好。

<merge/>多用于替换FrameLayout或者当一个布局包含另一个时,<merge/>标签消除视图层次结构中多余的视图组。

缺点:使用有些限制:

  1. merge必须放在布局文件的根节点上。
  2. merge并不是一个ViewGroup,也不是一个View,它相当于声明了一些视图,等待被添加。
  3. merge标签被添加到A容器下,那么merge下的所有视图将被添加到A容器下。
  4. 因为merge标签并不是View,所以在通过LayoutInflate.inflate方法渲染的时候, 第二个参数必须指定一个父容器,且第三个参数必须为true,也就是必须为merge下的视图指定一个父亲节点。
  5. 如果Activity的布局文件根节点是FrameLayout,可以替换为merge标签,这样,执行setContentView之后,会减少一层FrameLayout节点。
  6. 自定义View如果继承LinearLayout,建议让自定义View的布局文件根节点设置成merge,这样能少一层结点。
  7. 因为merge不是View,所以对merge标签设置的所有属性都是无效的。

 

3、需要时使用<ViewStub>

 优点:<ViewStub >标签最大的优点是当你需要时才会加载,使用他并不会影响UI初始化时的性能。各种不常用的布局想进度条、显示错误消息等可以使用<ViewStub >标签,以减少内存使用量,加快渲染速度。<ViewStub >是一个不可见的,大小为0的View。

缺点:

  • 还不支持 <merge> 标签
  •  ViewStub在加载完后会被移除,或者说是被加载进来的layout替换掉了,一旦ViewStub visible/inflated,则ViewStub将从视图框架中移除,其id view_stub也会失效,
  • ViewStub被绘制完成的layout文件取代,并且该layout文件的root view的id是android:inflatedId指定的id panel_import,root view的布局和ViewStub视图的布局保持一致

用法:在你需要的时候,根据id获取ViewStub的实例,调用 setVisibility(View.VISIBLE) 或者 inflate()让其显示即可

((ViewStub) findViewById(R.id.view_stub)).setVisibility(View.VISIBLE);
// or View
importPanel = ((ViewStub) findViewById(R.id.view_stub)).inflate();
  1.   <ViewStub   
  2.         android:id="@+id/view_stub"  
  3.     android:inflatedId="@+id/panel_import"
  4.         android:layout="@layout/profile_extra"  
  5.         android:layout_width="match_parent"  
  6.         android:layout_height="wrap_content"  
  7.         /> 

4、听说我们要尽可能地用 RelativeLayout ?

说法不正确,一般情况下,如果使用 LinearLayout,则一定要保证层级不能太深;如果使用 RelativeLayout,则需要尽量避免嵌套。

 

posted @ 2017-07-21 11:36  fangFXQ  阅读(132)  评论(0)    收藏  举报