天天看點

Android性能優化之UI實戰[]()1)利用系統定義的id[]()2)利用系統的圖檔資源[]()3)利用系統的字元串資源[]()4)利用系統的Style[]()5)利用系統的顔色定義[]()6)提取共同的元件,通過include引入[]()7)延遲加載隐藏的View

在Android應用開發過程中,螢幕上控件的布局代碼和程式的邏輯代碼通常是分開的。界面的布局代碼是放在一個獨立的xml檔案中的,這個檔案裡面是樹型組織的,控制着頁面的布局。通常,在這個頁面中會用到很多控件,控件會用到很多的資源。Android系統本身有很多的資源,包括各種各樣的字元串、圖檔、動畫、樣式和布局等等,這些都可以在應用程式中直接使用。這樣做的好處很多,既可以減少記憶體的使用,又可以減少部分工作量,也可以縮減程式安裝包的大小。

在xml檔案中引用系統的id,隻需要加上“@android:”字首即可。如果是在Java代碼中使用系統資源,和使用自己的資源基本上是一樣的。不同的是,需要使用android.R類來使用系統的資源,而不是使用應用程式指定的R類。這裡如果要擷取ListView可以使用android.R.id.list來擷取。
Android中沒有公開的資源,在xml中直接引用會報錯。除了去找到對應資源并拷貝到我們自己的應用目錄下使用以外,我們還可以将引用“@android”改成“@*android”解決。比如上面引用的附件圖示,可以修改成下面的代碼。

修改後,再次Build工程,就不會報錯了。

如果使用系統的字元串,預設就已經支援多語言環境了。如上述代碼,直接使用了@android:string/yes和@android:string/no,在簡體中文環境下會顯示“确定”和“取消”,在英文環境下會顯示“OK”和“Cancel”。

其中android:textAppearance="?android:attr/textAppearanceMedium"就是使用系統的style。需要注意的是,使用系統的style,需要在想要使用的資源前面加“?android:”作為字首,而不是“@android:”。

一般情況下,在項目的初期就能夠大緻确定整體UI的風格。是以早期的時候就可以做一些規劃,将通用的子產品先寫出來。

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

1)背景。有的應用在不同的界面裡會用到統一的背景。後期可能會經常修改預設背景,是以可以将背景做成一個通用子產品。

2)頭部的标題欄。如果應用有統一的頭部标題欄,就可以抽取出來。

3)底部的導航欄。如果應用有導航欄,而且大部分的Activity的底部導航欄是相同的,就可以将導航欄寫成一個通用子產品。

4)ListView。大部分應用都會用到ListView展示多條資料。項目後期可能會經常調整ListView的風格,是以将ListView作為一個通用的子產品比較好。

有時候,我們的頁面中可能會包含一些布局,這些布局預設是隐藏的,當使用者觸發了一定的操作之後,隐藏的布局才會顯示出來。比如,我們有一個Activity用來顯示好友的清單,當使用者點選Menu中的“導入”以後,在目前的Activity中才會顯示出一個導入好友的布局界面。從需求的角度來說,這個導入功能,一般情況下使用者是不使用的。即大部分時候,導入好友的布局都不會顯示出來。這個時候,就可以使用延遲加載的功能。

ViewStub是一個隐藏的,不占用記憶體空間的視圖對象,它可以在運作時延遲加載布局資源檔案。當ViewStub被設定為可見,或者調用inflate()函數時,才會真的去加載這個布局資源檔案。該ViewStub在加載視圖時會在父容器中替換它本身。是以,ViewStub會一直存在于視圖中,直到調用setVisibility(int)或者inflate()為止。ViewStub的布局參數會随着加載的視圖數一同被添加到ViewStub父容器。同樣,也可以通過使用inflated Id屬性來定義或重命名要加載的視圖對象的Id值。

通過“stub_import”這個id可以找到被定義的ViewStub對象。加載布局資源檔案“progress_overlay”後,ViewStub對象從其父容器中移除。可以通過“panel_import”這個id找到由布局資源“progress_overlay”建立的View。

繼續閱讀