Android 基礎的 Fragment 使用方式

Wayne Chen
5 min readMay 4, 2018

--

現在我們在開發 Android App 的時候,大多數脫離不了 Fragment 的設計,所以這邊就來彙整一些 Fragment 的基本使用。

Step 1: android.app.Fragment

首先來客製我們的 fragment,繼承 android.app.Fragment 。

onCreateView 這邊需要去加載我們 fragment 的 layout。

inflater.inflate(R.layout.fragment_home, container, false);

也能夠從 root view 去找到我們相對應元件的對象,但記得在這邊我們的 view 還有部分未加載完成,必須等到 onViewCreated 再去對我們的元件做操作。

在這邊提一下 inflate 方法

inflate(int resource, ViewGroup root, boolean attachToRoot)

Inflate a new view hierarchy from the specified xml resource.

resource 的部分是我們要加載的 layout,root 是接我們 fragment 的 container view,那 attachToRoot 是什麼呢?

其實 attachToRoot 主要是在設定說,是否直接幫我們將 view 在加載後,加進去 root view,舉個例子:

我有一個 View 要加進去 LinearLayout

View view = (View) inflater
.inflate(R.layout.custom_view, mLayout, false);
mLayout.addView(view);

會等同於

View view = (View) inflater
.inflate(R.layout.custom_view, mLayout, true);

設成 true 的時候,會幫我們省去加進去 root view 的步驟,但這得視情況而定。

在我們的 fragment 的使用上,需要設成 false 。

實際上如果設成 true 的話,會拋出一個 IllegalStateException,因為這個 view 已經擁有 parent view 了。

所以我們在這邊只能設成 false,並且在這之後得將 fragment 的 layout 加進去我們的 activity,而這部分的工作,就交給後面要介紹的 FragmentManager

Step 2: android.app.FragmentManager

我們需要用 FragmentManager 去操作 Fragment,這是基本使用 replace() 方法去完成加載 fragment 的範例:

在範例中我們看到,首先得先取得 FragmentManager

FragmentManager fragmentManager = getFragmentManager();

再來需要給予 FragmentTransaction 指令

fragmentTransaction = fragmentManager.beginTransaction();

這邊我們用的是 replace() 方法

fragmentTransaction.replace(R.id.container_main, 
mHomeFragment, "HOME");

replace(int containerViewId, Fragment fragment, String tag)

Replace an existing fragment that was added to a container.

最後在指令輸入結束的時候給 commit 去執行

fragmentTransaction.commit();

記得每次 commit 過後,要重新給予一系列的指令時,得重新 beginTransaction()

利用 navigation button 切換 fragment

Step 3: add() + show() + hide() 取代 replace()

每次切換 fragment 重新使用 replace() 方法的時候,fragment 的 lifecycle 會重頭開始跑,在我們某些設計之下可能會不太符合。

這邊可以使用 add() 的方法,切換 fragment 頁面時,將要顯示的 show(),不顯示的 hide(),這邊是多個 fragment 的情況,切換到 HomeFragment 的範例:

fragment 的 isAdded() 方法可以拿來判斷,是否已經被新增過,基本上新增過後的 fragment 會存在著,可以讓我們直接對 fragment 做 show()、hide() 的操作。

Step 4*: addToBackStack()

如果我們想在切換 fragment 頁面的時候,做到堆疊的效果,可以使用此方法,這樣 back key 就能夠回到上一頁。

fragment 的 isHidden() 方法可以拿來判斷是否隱藏。

Step 5: setArguments()

在使用 fragment 的時候,傳遞資料依然是使用我們的 Bundle。

最後在這邊提供範例給大家參考,有需要的話自行取用。

--

--