Gestore dello stato di Gestione frammenti
Importante
Questi articolo descrive le funzionalità e il materiale sussidiario disponibili nell'anteprima pubblica, che potrebbero tuttavia subire modifiche sostanziali prima del rilascio della versione disponibile a livello generale. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
La FragmentManagerStateHandler
classe consente di ripristinare frammenti quando si verifica una transizione in modalità schermo.
Quando si modifica la modalità di un'app da doppio schermo a modalità schermo singolo, tutti i frammenti vengono ricreati anche se non sono visibili.
Usando questa libreria, vengono ricreati solo i frammenti necessari.
I frammenti vengono ripristinati dal bundle di attività. Questo approccio include due bundle che vengono scambiati in fase di esecuzione a seconda della modalità di intervallo. Esiste un bundle per la singola schermata e un altro per la modalità di intervallo.
Ciò è possibile solo aggiungendo un callback del ciclo di vita dell'attività e scambiando questi due bundle all'interno del onActivityPreCreated
callback.
Il componente rileva automaticamente la modalità dello schermo. Ripristina solo i frammenti necessari, a seconda della modalità dello schermo.
Importante
Il componente funziona solo con attività di AndroidX.
Modalità d'uso
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()
}
Passaggi successivi
Informazioni su altre librerie di layout a doppio schermo.