Android布局优化经验总结

布局优化的目的是为了制作出高效、可复用的UI。 本文主要是对博主在平时开发的过程中关于布局经验的一个总结,觉得还有些用处,记录下来分享给大家。


HierarchyViewer

HierarchyViewer用来查看布局的层次,可以在sdk/tools下面找到,也可以通过Android Device Moniter打开。在部分手机上因为系统版本没有开放查看布局的权限,所以HierarchyViewer可能无法正常使用,可以使用ViewServer来运行HierarchyViewer。

<include>

这里的<include>标签与jsp中的<include>类似,都是为了包含可以重复使用的布局。把常用的布局提取出来做成单独的xml文件,在需要的时候直接<include>,提高开发效率。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
    <strong><include layout="@layout/header"/></strong>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="StaticBroadcast"
        android:id="@+id/btn_static"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

这里的header就是我们已经开发好的通用顶栏布局。

<merge>

<merge>主要是用来减少UI的层级,提高加载速度。<merge>常用来代替FrameLayout或者当一个布局include另一个布局的时候,<merge>用来消除目录结构中的多余ViewGroup。当你在一个FrameLayout中include一个layout时
<FrameLayout>
   <include layout="@layout/layout2"/>
</FrameLayout>

layout2.xml
<FrameLayout>
   <TextView />
</FrameLayout>

这样整个Layout就变成了
<FrameLayout>
   <FrameLayout>
      <TextView />
   </FrameLayout>
</FrameLayout>

这显然不是我们想要的,把layout2.xml改成
<merge>
   <TextView />
</merge>

整个Layout变成
<FrameLayout>
   <TextView />
</FrameLayout

<ViewStub>

<ViewStub>与<include>类似,也是加在另外一个布局,但是与include不同的是,<ViewStub>引入的布局默认是不显示的,不会占用CPU和内存,所以经常用来引入那些默认不显示的布局,比如进度条、错误提示等。

新建一个error.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

   <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Message" />

</RelativeLayout>

使用ViewStub

<RelativeLayout>xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    ...

    <ViewStub
        android:id="@+id/error_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout="@layout/error" />

</RelativeLayout>

在代码中显示ViewStub可以使用

((ViewStub) findViewById(R.id.error_layout)).setVisibility(View.VISIBLE);  或者View importPanel = ((ViewStub) findViewById(R.id. error_layout)).inflate();  


你可能感兴趣的:(ViewStub,include,merge,hierarchyviewer,布局优化)