Android 基礎的 Fragment 使用方式
現在我們在開發 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()
Step 3: add() + show() + hide() 取代 replace()
每次切換 fragment 重新使用 replace() 方法的時候,fragment 的 lifecycle 會重頭開始跑,在我們某些設計之下可能會不太符合。
這邊可以使用 add() 的方法,切換 fragment 頁面時,將要顯示的 show(),不顯示的 hide(),這邊是多個 fragment 的情況,切換到 HomeFragment 的範例:
Step 4*: addToBackStack()
如果我們想在切換 fragment 頁面的時候,做到堆疊的效果,可以使用此方法,這樣 back key 就能夠回到上一頁。
Step 5: setArguments()
在使用 fragment 的時候,傳遞資料依然是使用我們的 Bundle。
最後在這邊提供範例給大家參考,有需要的話自行取用。