Android性能优化之UI实战

在Android应用开发过程当中,屏幕上控件的布局代码和程序的逻辑代码一般是分开的。界面的布局代码是放在一个独立的xml文件中的,这个文件里面是树型组织的,控制着页面的布局。一般,在这个页面中会用到不少控件,控件会用到不少的资源。Android系统自己有不少的资源,包括各类各样的字符串、图片、动画、样式和布局等等,这些均可以在应用程序中直接使用。这样作的好处不少,既能够减小内存的使用,又能够减小部分工做量,也能够缩减程序安装包的大小。html

原文博客地址:http://www.apkbus.com/blog-919651-76902.htmlandroid

1)利用系统定义的id

在xml文件中引用系统的id,只须要加上“@android:”前缀便可。若是是在Java代码中使用系统资源,和使用本身的资源基本上是同样的。不一样的是,须要使用android.R类来使用系统的资源,而不是使用应用程序指定的R类。这里若是要获取ListView可使用android.R.id.list来获取。函数

<ListView 

android:id="@android:id/list" 

android:layout_width="fill_parent" 

android:layout_height="fill_parent"/>

2)利用系统的图片资源

Android中没有公开的资源,在xml中直接引用会报错。除了去找到对应资源并拷贝到咱们本身的应用目录下使用之外,咱们还能够将引用“@android”改为“@*android”解决。好比上面引用的附件图标,能够修改为下面的代码。布局

android:icon="@*android:drawable/ic_menu_attachment"

修改后,再次Build工程,就不会报错了。动画

3)利用系统的字符串资源

若是使用系统的字符串,默认就已经支持多语言环境了。如上述代码,直接使用了@android:string/yes和@android:string/no,在简体中文环境下会显示“肯定”和“取消”,在英文环境下会显示“OK”和“Cancel”。ui

4)利用系统的Style

<TextView.net

android:id="@+id/title" 

    android:layout_width="wrap_content" 

    android:layout_height="wrap_content" 

    android:textAppearance="?android:attr/textAppearanceMedium" />

其中android:textAppearance="?android:attr/textAppearanceMedium"就是使用系统的style。须要注意的是,使用系统的style,须要在想要使用的资源前面加“?android:”做为前缀,而不是“@android:”。code

5)利用系统的颜色定义

6)提取共同的组件,经过include引入

<include layout="@layout/navigator_bar" />

通常状况下,在项目的初期就可以大体肯定总体UI的风格。因此早期的时候就能够作一些规划,将通用的模块先写出来。xml

下面是可能能够抽出的共用的布局:htm

1)背景。有的应用在不一样的界面里会用到统一的背景。后期可能会常常修改默认背景,因此能够将背景作成一个通用模块。

2)头部的标题栏。若是应用有统一的头部标题栏,就能够抽取出来。

3)底部的导航栏。若是应用有导航栏,并且大部分的Activity的底部导航栏是相同的,就能够将导航栏写成一个通用模块。

4)ListView。大部分应用都会用到ListView展现多条数据。项目后期可能会常常调整ListView的风格,因此将ListView做为一个通用的模块比较好。

7)延迟加载隐藏的View

有时候,咱们的页面中可能会包含一些布局,这些布局默认是隐藏的,当用户触发了必定的操做以后,隐藏的布局才会显示出来。好比,咱们有一个Activity用来显示好友的列表,当用户点击Menu中的“导入”之后,在当前的Activity中才会显示出一个导入好友的布局界面。从需求的角度来讲,这个导入功能,通常状况下用户是不使用的。即大部分时候,导入好友的布局都不会显示出来。这个时候,就可使用延迟加载的功能。

ViewStub是一个隐藏的,不占用内存空间的视图对象,它能够在运行时延迟加载布局资源文件。当ViewStub被设置为可见,或者调用inflate()函数时,才会真的去加载这个布局资源文件。该ViewStub在加载视图时会在父容器中替换它自己。所以,ViewStub会一直存在于视图中,直到调用setVisibility(int)或者inflate()为止。ViewStub的布局参数会随着加载的视图数一同被添加到ViewStub父容器。一样,也能够经过使用inflated Id属性来定义或重命名要加载的视图对象的Id值。

<ViewStub 

android:id="@+id/stub_import" 

android:inflatedId="@+id/panel_import" 

android:layout="@layout/progress_overlay" 

android:layout_width="fill_parent" 

android:layout_height="wrap_content" 

android:layout_gravity="bottom" />

经过“stub_import”这个id能够找到被定义的ViewStub对象。加载布局资源文件“progress_overlay”后,ViewStub对象从其父容器中移除。能够经过“panel_import”这个id找到由布局资源“progress_overlay”建立的View。

((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE); 

// 或者 

View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();
相关文章
相关标签/搜索