1. 程式人生 > >Android安全/開發基礎--11--圖形介面(UI)和碎片(Fragment)(下)

Android安全/開發基礎--11--圖形介面(UI)和碎片(Fragment)(下)

10-9、UI fragment與fragment管理器

採用fragment而不是activity來管理應用UI,可繞開Android系統activity使用規則的限制。fragment是一種控制器物件,activity可委派它執行任務。這些任務通常就是管理使用者介面。

fragment本身沒有在螢幕上顯示檢視的能力。因此,只有將它的檢視放置在activity的檢視層級結構中, fragment檢視才能顯示在螢幕上。

管理使用者介面的fragment又稱為UI fragment。它自己也有產生於佈局檔案的檢視。 fragment檢視包含了使用者可以互動的視覺化UI元素。

Google有兩個版本的fragment實現可供選擇:原生版本和支援庫版本。

原生版本的fragment實現內建在裝置系統中。如果應用要支援各個系統版本,在不同裝置上執行的fragment可能會有不同的表現。

支援庫版本的fragment在類庫裡,釋出時,會打包在應用裡。使用支援庫fragment的應用,無論在哪臺裝置上執行,都會有相同的表現。

修改程式碼繼承Fragment類時 , Android Studio會找到兩個同名Fragment類: Fragment(android.app. Fragment)和Fragment (android.support.v4.app. Fragment)。前者是Android作業系統內建版Fragment,後者是支援庫版Fragment。通常選擇後者。

activity託管UI fragment有如下兩種方式:

1、在activity佈局中新增fragment:簡單但不夠靈活。在activity佈局中新增fragment, 就等同於將fragment及其檢視與activity的檢視繫結在一起,並且在activity的生命週期過程中,無法替換fragment檢視。

碎片完整的生命週期示意圖:

在這裡插入圖片描述

2、在activity程式碼中新增fragment:比較複雜,但也是唯一可以動態控制fragment的方式。何時新增fragment以及隨後可以完成何種具體任務由你自己定;也可以移除fragment,用其他fragment代替當前fragment,然後重新新增已移除的fragment。通常使用這種方式。

fragment之所以能保留,是因為這樣一個事實:可以銷燬和重建fragment的檢視,但fragment自身可以不被銷燬。新的配置可能需要新的資源來匹配;當有更合適的資源可用時,則應重建檢視。

必須同時滿足以下兩個條件, fragment才能進入保留狀態:

1、已呼叫了fragment的setRetainInstance(true)方法。 2、因裝置配置改變(通常為裝置旋轉),託管activity正在被銷燬。 fragment只能保留非常短的時間,即從fragment脫離舊activity到重新附加給快速新建的activity之間的一段時間。

fragment是用來封裝關鍵元件以方便複用。這裡所說的關鍵元件,是針對應用的整個螢幕來講的。應用單屏最多使用2~3個fragment。 對於fragment,堅持AUF(Always Use Fragments)原則,即“總是使用fragment”。不值得為使用fragment還是activity傷腦筋。

從fragment中啟動activity類似於從activity中啟動activity。我們呼叫Fragment.startActivity(Intent)方法,由它在後臺再呼叫對應的Activity方法。

建立例項變數的方式並不可靠。因為在作業系統重建fragment時使用者暫時(裝置配置發生改變)離開當前應用(作業系統按需回收記憶體),任何例項變數都將不復存在。fragment argument就是為應對上述場景而生。

10-10、限定符

程式執行時根據裝置的解析度或螢幕大小動態的來決定載入哪個佈局,即使用限定符。手機通常使用單頁模式,平板通常使用雙頁模式。而限定符就是用來判斷程式到底是使用單頁符還是雙頁符的。

Android中一些常見的限定符參考下表: 在這裡插入圖片描述

以下是文字表格(表格合併問題,只有後兩列。Ps:以上表格為我寫的word文件)

限定符 描述
small 提供給小螢幕裝置的資源
normal 提供給中等螢幕裝置的資源
large 提供給大螢幕裝置的資源
xlarge 提供給超大螢幕裝置的資源
ldpi 提供給低解析度裝置的資源(120dpi以下)
mdpi 提供給中等解析度裝置的資源(120dpi-160dpi)
hdpi 提供給高解析度裝置的資源(160dpi-240dpi)
xhdpi 提供給超高解析度裝置的資源(240dpi-320dpi)
xxhdpi 提供給超超高解析度裝置的資源(320dpi-480dpi)
land 提供給橫屏裝置的資源
port 提供給豎屏裝置的資源

10-11、XML drawable

在Android中凡是要在螢幕上繪製的東西都可以叫作drawable,比如抽象圖形、 Drawable類的子類程式碼、點陣圖影象等。使用ShapeDrawable,可以把按鈕變成圓。

建立圓形drawable。程式碼舉例如下:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
	android:shape="oval">
	<solid 
		android:color="@color/dark_blue"/>
</shape>

把應用啟動器圖示放在mipmap目錄中,其他圖片都放在drawable目錄中。

9-patch影象是一種特別處理過的檔案,能讓Android知道影象的哪些部分可以拉伸,哪些部分不可以。9-patch影象分成3×3的網格,即由9部分或9 patch組成的網格。網格角落部分不會被縮放,邊緣部分的4個patch只按一個維度縮放,而中間部分則按兩個維度縮放

10-12、使用ViewPager

FragmentPagerAdapter是另外一種可用的PagerAdapter,其用法與FragmentStatePagerAdapter基本一致。唯一的區別在於,解除安裝不再需要的fragment時, 各自採用的處理方法有所不同。

FragmentStatePagerAdapter會銷燬不需要的fragment。

FragmentPagerAdapter對於不再需要的fragment,會選擇呼叫事務的detach(Fragment)方法來處理它,而非remove(Fragment)方法。

10-13、工具欄

工具欄使用AppCompat庫。工具欄選單由選單項組成,它佔據著工具欄的右上方區域。選單項的操作應用於當前螢幕,甚至整個應用。

選單是一種類似於佈局的資源。建立選單定義檔案並將其放置在res/menu目錄下, Android會自動生成相應的資源ID。隨後,在程式碼中例項化選單時,就可以直接使用。

在專案工具視窗中,右鍵單擊res目錄,選擇New → Android resource file選單項。在彈出的視窗介面, 選擇Menu資源型別,並命名資原始檔為fragment_crime_list即可完成。

出於相容性考慮,AppCompat庫需要使用app名稱空間。從而相容支援各種舊系統版本裝置。

應用使用的圖示有兩種:系統圖標和專案資源圖示。 系統圖標(system icon)是Android作業系統內建的圖示。專案資源圖示即建立的自定義圖示。這需要針對不同螢幕顯示密度或各種可能的裝置配置,準備不同版本的圖示。

後退鍵導航和層級式導航:

臨時性導航:即使用後退鍵導航,只能返回到上一次瀏覽過的使用者介面。 層級式導航:點選螢幕左上方的箭頭向上導航,可在應用內逐級向上導航。

10-14、對話方塊

對話方塊既能引起使用者的注意也可接收使用者的輸入。在提示重要資訊或提供使用者選項方面,它都非常有用。若用新式對話方塊則需要谷歌提供的AppCompat庫版AlertDialog類。這個類和作業系統內建版AlertDialog類似,能相容舊版本系統。要使用它需要引入android.support.v7.app. AlertDialog依賴項。建議將AlertDialog封裝在DialogFragment(Fragment的子類)例項中使用。

DialogFragment例項也是由託管activity的FragmentManager管理的。要將DialogFragment新增給FragmentManager管理並放置到螢幕上,可呼叫fragment例項的以下方法:

public void show(FragmentManager manager, String tag)
public void show(FragmentTransaction transaction, String tag)

String引數可唯一識別FragmentManager佇列中的DialogFragment。 兩個方法都可以:如果傳入FragmentTransaction引數,你自己負責建立並提交事務;如果傳入FragmentManager引數,系統會自動建立並提交事務。

裝置配置改變時,具有ID屬性的檢視可以儲存執行狀態;這也就是即使裝置旋轉,使用者所做的操作仍然會保留。 編寫需要使用者大量輸入以及要求更多空間顯示輸入的應用,並且要讓應用同時支援手機和平板裝置時,使用onActivityResult()方法返回資料給目標fragment是比較方便的。

10-15、樣式和主題

在Android Studio中建立的專案都自帶AppCompat主題。

AppCompat庫自帶三大主題:

Theme.AppCompat——深色主題
Theme.AppCompat.Light——淺色主題
Theme.AppCompat.Light.DarkActionBar——帶深色工具欄的淺色主題

把AppTheme的父主題修改為Theme.AppCompat,這樣專案就有了一個深色主題基板。

想修改應用主題,需要向上查詢目標屬性的父主題,即主題繼承的源頭。例如:windowBackground主題背景色的屬性。方法:開啟styles.xml檔案,按住Ctrl鍵,點選Base.Theme.AppCompat。

<style name="Theme.AppCompat" parent="Base.Theme.AppCompat" />

10-16、定製檢視和觸控事件

Android標準檢視與元件歸為以下兩大類別:

簡單檢視。簡單檢視內部也可以很複雜,之所以歸為簡單類別,是因為簡單檢視不包括子檢視。簡單檢視幾乎總是用來處理定製繪製。 聚合檢視。 聚合檢視由其他檢視物件組成。聚合檢視通常用來管理子檢視,但不負責處理定製繪製。圖形繪製任務都委託給了各個子檢視。

定製檢視所需的三大步驟:

1、選擇超類。對於簡單定製檢視而言, View是個空白畫布,因此它作為超類最常見。對於聚合定製檢視,我們應選擇合適的超類佈局,比如FrameLayout。 2、繼承選定的超類,覆蓋超類的構造方法。 3、覆蓋其他關鍵方法,以定製檢視行為。

應用啟動後,所有檢視都處於無效狀態。為此 Android呼叫了頂級View檢視的draw()方法。這會引起自上而下的鏈式呼叫反應。首先,檢視完成自我繪製,然後是子檢視的自我繪製,再然後是子檢視的子檢視的自我繪製,如此呼叫下去直至繼承結構的末端。當繼承樹中的所有檢視都完成自我繪製後,最頂級View檢視也就生效了。