Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK

在Android中創建復合視圖

by
Difficulty:IntermediateLength:LongLanguages:

Chinese (Traditional) (中文(繁體)) translation by xingshi (you can also view the original English article)

 在構建復雜的應用程序時,經常希望在應用程序的各個地方重用同壹組視圖(view)。解決此問題的壹種方法是創建壹個視圖,該視圖封裝壹組視圖的邏輯和布局以便可以重用它們,而不會在項目的各個不同位置重復代碼。 在本教程中,您將學習如何使用復合視圖創建易於重用的自定義視圖。

1.引言

在Android上,由壹組視圖組成的視圖稱為復合視圖或復合組件。 在本教程中,將構建壹個控件,從列表中選擇壹個值從壹側滾動到另壹側。由於Android SDK的默認從列表中選擇壹個值的視圖稱為微調器,因此我們將該視圖組合命名為側邊微調器。以下界面截圖說明了我們將在本教程中創建的內容。

2.  項目設置

要開始使用,您必須使用Android 4.0創建壹個新的Android項目作為最低要求的SDK級別。該項目應該只包含壹個名為MainActivity的空白activity   在Activity什麽都不做除了初始化布局,如下面的代碼片段。

MainActivity的布局位於  / res / layout / activity_main.xml  文件中,它應該只包含壹個空RelativeLayout,復合視圖稍後會在裏面顯示。

3.創建壹個復合視圖

要創建復合視圖,必須創建壹個新的類來管理復合視圖中的視圖。對於側邊微調器,需要兩個Button箭頭、TextView視圖和壹個用於顯示所選值的視圖。

要開始,請創建將用於側邊微調器類的  / res / layout /sidespinner_view.xml布局文件,確保將三個視圖包裹在merge 標簽中。

接下來,我們需要創建壹個SideSpinner加載此布局的類,並將箭頭設置為按鈕的背景圖像。現在,復合視圖什麽都不做,因為沒有什麽可以顯示的。

您會註意到復合視圖繼承了  LinearLayout視圖組。這意味著使用復合視圖的任何布局都可以訪問線性布局的屬性。 其結果是,該組合視圖布局比平常有點不同,根標記是壹個  merge標記,而不是像普通視圖組的LinearLayout標簽 或RelativeLayout

將復合視圖添加到MainActivity的布局時,復合視圖的根標簽將作為LinearLayout標簽。復合視圖類可以從任何 ViewGroup派生類派生出來 ,但在這種情況下,線性布局是最合適的,因為視圖是水平布置的。

4.  將復合視圖添加到布局

此時編譯項目,但由於復合視圖不在MainActivity的布局中,因此什麽都沒有。 側邊微調視圖必須像任何其他視圖壹樣添加到activity的布局中。標簽的名稱是SideSpinner類的全名,包括命名空間。

要將側邊微調器添加到MainActivity,請將以下內容添加到/ res / layout /activity_main.xml  文件中的相對布局中  。

SideSpinner>標簽中可用的屬性是線性布局的屬性,因為我們創建的SideSpinner類繼承了LinearLayout類。如果啟動項目,側邊微調應該是可見的,但它還沒有包含任何值。

5.  向復合視圖添加方法

如果我們想要實際使用側邊微調器,還有壹些缺點。我們應該能夠向微調框添加新值,選擇壹個值,並獲取所選的值。

向復合視圖添加新行為的最簡單的方法是向類添加新的公共方法SideSpinner。任何具有該視圖引用的Activity都可以使用這些方法。

當布局中的所有視圖都被加載並準備使用時,將調用復合視圖的onFinishInflate方法。如果您需要在復合視圖中修改視圖,則可以在該方法裏面添加代碼。

使用剛剛添加到SideSpinner類中的方法,現在可以添加選擇上壹個和下壹個值的按鈕的行為。用以下方法替換onFinishInflate方法中的現有代碼:

通過新創建setValuessetSelectedIndex 方法,我們現在可以在我們的代碼中初始化側邊微調器。  通過新創建setValues和setSelectedIndex 方法,我們現在可以在我們的代碼中初始化側邊微調器。與任何其他視圖壹樣,您需要使用findViewById方法在布局中找到側邊微調器視圖  。

然後,我們可以從返回的對象中調用視圖上的任何公共方法,包括我們剛剛創建的對象。以下代碼片段顯示了如何更新MainActivity類的onCreate方法,通過使用setValues來顯示側邊微調器中的值列表。默認情況下,我們也可以通過調用setSelectedIndex 方法來選擇列表中的第二個值  。

如果啟動應用程序,側邊微調器應按預期工作。顯示值列表,默認情況下選擇橙色值。

6.將布局屬性添加到復合視圖

Android SDK中提供的視圖可以通過代碼進行修改,但也可以在相應的布局中直接設置壹些屬性。讓我們添加壹個屬性給側邊微調器,設置側邊微調器需要顯示的值。

要為復合視圖創建自定義屬性,我們首先需要在/ res / values / attr.xml文件中定義屬性。 復合視圖的每個屬性都應該被分組成帶有 <declare-styleable>標簽的樣式  。對於側邊微調器,使用類的名稱,如下所示。

attr  標簽中,name 屬性包含用引用布局中新屬性的標識符,format屬性包含新屬性的類型。

對於值列表,使用reference類型,因為該屬性將引用定義為資源的字符串列表。正常情況下在布局中使用的值類型可用於自定義屬性,包括  booleancolordimension、enum、integerfloat和  string

下面顯示如何定義字符串列表的資源,該資源用於側面微調器的 values屬性。必須將其添加到  / res / values / strings.xml文件中,如下所示。

要測試新的values 屬性,請在現有側邊微調器下面的MainActivity布局中創建壹個側邊微調器視圖。 該屬性必須帶有添加到RelativeLayout的名稱空間的前綴 ,例如  xmlns:sidespinner="http://schemas.android.com/apk/res-auto"。這是/ res / layout / activity_main.xml中最後的布局 ,具體如下。

最後,需要修改SideSpinner類來讀取values屬性。視圖的每個屬性的值在AttributeSet對象可用,該對象作為視圖構造函數的參數。

要獲取自定義values屬性的值,我們首先 使用包含該屬性的樣式名稱來調用AttributeSet對象的obtainStyledAttributes方法  。這將返回該樣式作為TypedArray對象的屬性列表。

然後,我們調用具有所需屬性正確類型的TypedArray對象的getter方法,將屬性的標識符作為參數傳遞。以下代碼塊顯示了如何修改側邊微調框的構造函數以獲取值列表,並將其設置在側邊微調器中。

如果您啟動應用程序,您應該看到兩個獨立工作的側邊旋轉器。

7.保存並恢復狀態

我們需要完成的最後壹步是保存和恢復組合視圖的狀態。 當activity被摧毀並重建時,例如,當設備旋轉時,具有唯壹標識符的本地視圖的值將被自動保存並恢復。這對於側邊旋轉器來說當然不是這樣。

視圖的狀態未保存。SideSpinner 類中視圖的標識符不是唯壹的,因為它可以重復使用多次。這意味著我們負責在復合視圖中保存和還原視圖的值。 我們通過onSaveInstanceStateonRestoreInstanceState和  dispatchSaveInstanceState方法來實現。以下代碼塊顯示了如何為側邊旋轉器執行此操作。

結論

側邊微調器現在完成了。兩個側邊微調器都按照預期的方式工作,如果activity被銷毀並重建,它們的值將被恢復。 您現在可以通過使用復合視圖將您學到的內容應用於Android應用程序中的任何視圖組中。

关注我们的公众号
Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.