片段管理員狀態處理常式
重要
本文說明 處於公開預覽 狀態的功能和指引,而且可能會在正式推出之前大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
類別 FragmentManagerStateHandler
有助於在螢幕模式轉換發生時還原片段。
當我們將應用程式的模式從雙螢幕變更為單一螢幕模式時,即使它們看不到,也會重新建立所有片段。
使用此程式庫時,只會重新建立所需的片段。
片段會從活動配套還原。 此方法有兩個套件組合,會根據範圍模式在執行時間交換。 單一畫面有一個組合,另一個用於範圍模式。
這只能藉由新增活動生命週期回呼並在回呼內 onActivityPreCreated
交換這兩個配套來達成。
元件會自動偵測螢幕模式。 它只會根據螢幕模式還原我們需要的片段。
重要
元件僅會與來自 AndroidX 的活動搭配運作。
如何使用
class SampleApp : Application() {
override fun onCreate() {
super.onCreate()
FragmentManagerStateHandler.init(this)
}
}
class SampleActivity : AppCompatActivity() {
companion object {
private const val FRAGMENT_DUAL_START = "FragmentDualStart"
private const val FRAGMENT_DUAL_END = "FragmentDualEnd"
private const val FRAGMENT_SINGLE_SCREEN = "FragmentSingleScreen"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_sample)
registerWindowInfoFlow()
}
private fun registerWindowInfoFlow() {
val windowInfoRepository = windowInfoRepository()
lifecycleScope.launch(Dispatchers.Main) {
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
windowInfoRepository.windowLayoutInfo.collectIndexed { index, info ->
if (index == 0) {
onScreenInfoChanged(info)
}
}
}
}
}
/**
* Called whenever the screen info was changed.
* @param windowLayoutInfo object used to retrieve screen information
*/
private fun onScreenInfoChanged(windowLayoutInfo: WindowLayoutInfo) {
when {
windowLayoutInfo.isInDualMode() -> setupDualScreenFragments()
else -> setupSingleScreenFragments()
}
}
/**
* Adds fragments for the single screen mode
*/
private fun setupSingleScreenFragments() {
if (supportFragmentManager.findFragmentByTag(FRAGMENT_SINGLE_SCREEN) == null) {
supportFragmentManager.inTransaction {
replace(R.id.first_container_id, SingleScreenFragment(), FRAGMENT_SINGLE_SCREEN)
}
}
}
/**
* Adds fragments for the dual screen mode
*/
private fun setupDualScreenFragments() {
if (supportFragmentManager.findFragmentByTag(FRAGMENT_DUAL_START) == null &&
supportFragmentManager.findFragmentByTag(FRAGMENT_DUAL_END) == null
) {
supportFragmentManager.inTransaction {
replace(R.id.first_container_id, DualStartFragment(), FRAGMENT_DUAL_START)
}
supportFragmentManager.inTransaction {
replace(R.id.second_container_id, DualEndFragment(), FRAGMENT_DUAL_END)
}
}
}
}
inline fun FragmentManager.inTransaction(func: FragmentTransaction.() -> Unit) {
val fragmentTransaction = beginTransaction()
fragmentTransaction.func()
fragmentTransaction.commit()
}
後續步驟
瞭解其他 雙螢幕配置程式庫。