打開前面導入時建立好的 Frgament.kt 檔
會看到已經有一個建立好並繼承 Fragment Class 的 Class
並且已經 override 一個 onCreatView function
class BlankFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_blank_fragment, container, false)
}
}
Fragment 的畫面就是在 onCreateView() 這個階段實例化並建立出來
因此可以在這個方法中載入我們設置的 Layout 做為 Fragment 的 View
也可在這方法中為 Fragment 中的按鈕設置監聽器
onCreateView (inflater: LayoutInflater, container: ViewGroup, savedInstanceState: Bundle)
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.main_fragment_1, container, false)
view!!.frag_button.setOnClickListener { intent.intent(this.context, Activity_2()) }
return view
}
inflater:LayoutInflater 物件,用來實例化 Layout
關於載入 Layout 實例化為 View 的方法可參考 Day 6 內容
container:Fragment 生成的依據,可以為 null
用靜態載入時,container 是 null
因為 Fragment 有放在 Activity 的 Layout 中,該 Layout 就是該 Fragment 的生成依據,因此可以依據此 Layout 生成並顯示 。
用動態載入時,container 會是 FragmentTransaction add 方法傳入的 container,Fragment 會以這個 container 為依據生成並顯示。
若使用 add 方法時沒傳入 container,container 會是 null,此時 Fragment 沒有生成的依據,LayoutParams 會是 null,Fragment 將顯示會為空的
若不希望顯示為空的,可將 inflate 方法中的 ViewGroup 參數寫為你希望做為 container 的 View,Fragment 就會以這個 View 做為依據生成並顯示
savedInstanceState:先前的實例狀態,可以為 null。
若非 null 則 Fragment 被再次建立時將依先前的實例狀態被重構出來
!非重建先前的 View 狀態
用來管理 Fragment
FragmentManager 會有一個自己的 Fragment 清單,將 Fragment 交給 FragmentManager 時該 Fragment 就會被加入清單中。
FragmentManager 會維護該清單,處理 Fragment 狀態在 back stack 中的進出,也可對 back stack 和 Fragment 的生命週期做監聽,或是透過 beginTransaction() 方法取得 FragmentTransaction 進而對 Fragment 做操作。
back stack:
類似於 Activity 的堆疊,Fragment 也有堆疊,就是這個 back stack。
Fragment 可透過 FragmentTransaction 中的方法將一系列操作存進 back stack 中,並可透過 FragmentManager 中的方法反執行存起來的那些操作,推出原先的 Fragment 狀態。
> back stack 參考資料
透過 getSupportFragmentManager() 方法取得 FragmentManager
val manager = supportFragmentManager
以下為一些簡單的 FragmentManager 方法
val transaction = manager.beginTransaction()
取得 FragmentTransaction,透過 FragmentTransaction 可對 Fragment 做許多操作。
關於 FragmentTransaction 將在後面做詳細介紹
透過 id 取得 Fragment
id:(靜態載入時)Layout 中為 Fragment 設置的 id,或是動態載入時 add 方法設置的 container id。
若用同一個 container 載入多個不同的 Fragment,
則找到的 Fragment 會是最後一個載入的 Fragment。
val fragment_0 = findFragmentById(R.id.fragment_0)
findFragmentByTag (tag: String)
透過 tag 取得 Fragment
tag:(靜態載入時)Layout 中為 fragment 設置的 tag,或動態載入時為 fragment 加上的 tag。
val fragment_0 = findFragmentByTag("fragment_0")
取得目前在 back stack 中 Fragment 的個數(回傳 Int)
取得目前 FragmentManager 的 Fragment 清單(回傳 List<Fragment>)
將 back stack 中最上層的 Fragment 狀態推出
當 back stack 中不為空時,按返回鍵就會默認調用此方法,返回 stack 中最上層的 Fragment 狀態
此方法會從 Fragment 生命週期的 onCreatView() 階段開始執行
更多推出方法(如:推出指定狀態)
請參考 官方文件 中的方法或 back stack 參考資料
其他 FragmentManager 方法請參考 官方文件
Android
Kotlin
Fragment
FragmentManager