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();
相關文章
相關標籤/搜索