Android高效入門-上下不同種類的Fragment與Support v4

作者 | 2016-06-27

瞭解Fragment的由來與生命週期後,實作Fragment時,可使用Android Studio提供方便的功能,設計出不同需求的APP畫面配置,例如「上下不同種類Fragment」或是「同一位置更換不同的Fragment」等,這些都是常見的應用實例,本篇將建立一個Activity,其上下使用不同種類的Fragment類別,例如上面是聯絡人清單,下方是某聯絡人的詳細資訊。

進行本篇內容之前,請先參考「Android高效入門-Fragment片段的由來與生命週期

Fragment實作

功能與畫面的配置有非常多種,不同功能需求應以不同的架構設計,本篇的情境是當Activity中有上下兩個Fragment,而上方位置永遠使用某一個特定Fragment,下方則使用另一種Fragment,Fragment裏的內容可能會改變,但其所在位置不會放入其他種類的Fragment。

上下不同種類的Fragment

開發應用程式時常需要自行設計Fragment類別,建立一個新類別,並繼承Fragment類別,本篇將設計兩個Fragment類別,一為ContactFragment類別,第二個是DetailFragment,它們都在一個Activity中,並以上下方式顯示,如下圖:

A4486

如上圖的Activity,可在上方Fragment中顯示如聯絡人的清單,當點擊其中一個聯絡人則在下方的Fragment中顯示該聯絡人的詳細資訊。

建立時,應先產生兩個Fragment後,再加入到ContactActivity的畫面中,接下來將先建立Fragment,待完成後再產生ContactAcvitiy類別,步驟說明如下。

建立新類別並繼承Fragment類別

先點擊專案視窗中的「app」後,在功能表中點擊「File/New/Fragment/Blank Fragment」建立一個新的空白Fragment,如下圖:

A4474

上圖的功能項目中還有另外兩個功能:

  • Fragment(List)

產生一個內有ListView清單元件的Fragment。

  • Fragment(with a +1 button)

產生一個內有一個按鈕元件的Fragment,按鈕中文字為「+1」,使用Material Design實感設計與其浮動鈕。

請先選擇建立「Fragment(Blank)」空白Fragment,再為其更改預設名稱為ContactFragment,如下圖:

A4985

為了不增加複雜度,先不勾選最右邊的,兩個選項的意義如下:

  • Create layout XML

建立該Fragment的版面設計檔,本例為「res/layout/fragment_contact」。

  • Include fragment factory methods?

是否在ContactFragment類別中自動產生工廠方法,也就是類別層級的newInstance方法,不需使用或設計複雜的建構子,提供一個建立與取得物件方法,產生的newInstance方法內容如下:

  • Include interface callbacks?

如果Fragment所在的Activity想要得到Fragment變動的資訊時,此選擇會建立一個呼叫機制(Java的介面),當勾選此選項時,Activity類別需實作一個客製化的介面(Interface)才能呼叫成功,在此先不勾選。

自動產生的檔案如下:

fragment_contact.xml的原始碼如下:

將上述的版面設計檔內的TextView的「android:text」屬性值改為「聯絡人清單Fragment」。

接著請用同樣的方式,再產生另一個「DetailFragment」,它的程式碼與ContactFragment類似,其版面版置檔「fragment_detial.xml」如下:

也請把TextView的文字屬性值改為「聯絡人詳細資料Fragment」,以便未來執行時能夠辨識。

設計ContactActivity

當兩個Fragment都完成後,再開始產生新的Activity畫面,請點擊功能表「File/New/Activity/Blank Activity」產生一個空白的Activity,名稱為「ContactActivity」,如下圖:

A4987

請勾選「Launcher Activity」建立Activity,目的是要它成為應用程式啟動的第一個畫面,勾選本項後會在AndroidManifest.xml的activity加入「intent-filter」元素,請將上節的MainActivity內的intent-filter元素刪除,未來應用程式執行時會自動啟動現在建立的ContactActivity,如下圖AndroidManifest.xml片段:

A4488

提示:

一個應用程式在AndroidManifest.xml定義檔中,應該只有一個Activity內有上述的intent-filter描述,如果有兩個Activity都有時,會使用第一個做為應用程式啟動的主畫面。

接下來請開啟「res/layout/activity_contact.xml」,它是ContactActivity使用的版面配置檔,先更換成「LinearLayout」,設定它的「orientation」排列屬性為「vertical」垂直。

再到元件選擇區的最下方「custom」分類,點擊一下「<fragment>」,會出現Fragment選擇對話框,如下圖:

A4490

先點擊加入ContactFragment在LinearLayout中,再加入DetailFragment,兩個Fragment的「android:weight」值請都設為「1」或其他非零值。完成後的預覽圖如下:

A4491

提示:

放入Fragment類別時,若出現「Rendering Problems」問題,請點擊選擇合適的版面配置檔,讓預覽繪製器能以解析正確的配置檔,以顯示正確的預覽圖,如下圖:

A4988

content_contact.xml的完整內容如下:

執行結果

執行後的ContactActivity內有上下兩個Fragment,如下圖:

A4492

單一物件設計模式-Singleton

「Singleton」是為了避免在執行過程中產生一個以上物件的設計模式(Design Pattern),為類別設計一個方法,以確保每次呼叫此方法取得物件時,不會重覆產生物件,使用同一物件實例以避免不必要的資源浪費。

以ContactFragment類別為例,類別中新增一個static物件,如下圖:

A4497

再設計原類別內的newInstance方法修改成取得單一物件的方式,如下:

未來,只要呼叫類別方法newInstance即可取得唯一的物件:

Support v4類別庫

如果應用程式想要支援較舊的手機版本,如Android 3.0之前的版本時,使用Fragment類別時就應該使用「Support v4」支援類別庫內的類別,在import語法中使用:

如果應用程式最低的版本是大於Android 3.0(API Level 11)以上時,例如模組app的build.gradle的內容中的miniSdkVersion值為15,如下圖:

A4498

API Level 15代表最低版本為Android 4.0.3,那就可以全部都使用內建的Fragment物件,import語法如下:

除了Fragment類別外,與Fragment有關的類別都是如此,例如:

如需要向下相容舊版手機環境,都應改用android.support.v4.app套件下的類別,本範例採用的是此方法,使用的是support v4的類別。

相關文章:

Category: Android Fragment 標籤:, , , ,

關於 Hank Tom

專長為程式語言、雲端服務開發,Linux系統管理, 任職:利拓科技 技術長,海林行動科技 技術總監 輔仁大學 兼任助理教授 ,為 Android高效入門>深度學習、CentOS 7建置、管理與伺服器架設實戰、Java網路程式設計、雲端網頁程式設計-Google App Engine應用實作 等書作者

使用Facebook直接回應

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *