2.透過程序來添加 Fragment
要如何提供 Fragment 所需的初始化資料?
class ExampleActivity : AppCompatActivity(R.layout.example_activity) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (savedInstanceState == null) {
val bundle = bundleOf("some_int" to 0)
supportFragmentManager.commit {
setReorderingAllowed(true)
add<ExampleFragment>(R.id.fragment_container_view, args = bundle)
}
}
}
}
上面例子中,fragment transaction 只在savedInstanceState
是 null (空值) 時才被建立。這是為了確保在 Activity 首次建立時僅一次性地添加 Fragment。當裝置設定(configuration)發生改變,並重新建立 Activity 時,savedInstanceState
不再是 null。由於 Fragment 自動從 savedInstanceState
恢復,而不需再次添加 Fragment 。
如果 Fragment 需要初始化資料,可以調用FragmentTransaction.add()
來提供Bundle
,使引數(arguments)[註1]被傳遞到 Fragment。
class ExampleFragment : Fragment(R.layout.example_fragment) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val someInt = requireArguments().getInt("some_int")
...
}
}
在 Fragment 調用requireArguments()
可以得到引數(arguments)Bundle
。之後,適合的Bundle
getter [註2] 方法可以得到每個引數(arguments)。
上面2段程式碼,可以看到在 Activity onCreate()
後,才有 Fragment 的onViewCreated()
。這邊可以先記著這兩個不同生命週期階段的先後順序。並且,在這兩者之間還會有其他的生命週期階段!
[註1]
函式使用的東西是參數(parameter)。呼叫方傳給函式的東西是引數(argument)。
[註2]
getter 方法,是讓我們取得屬性值。它的唯一用途,就是回傳它應該回傳的值。
setter 方法,是讓我們設定屬性值。它的目標,是接收一個引數值,並且用它來設定某個屬性值。
參考資料