Gestore dello stato di gestione dei frammentiFragment Manager State Handler

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.This article describes functionality and guidance that is in public preview and may be substantially modified before it's generally available. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.Microsoft makes no warranties, express or implied, with respect to the information provided here.

FragmentManagerStateHandler è una classe che consente di ripristinare i frammenti quando si verifica una transizione della modalità schermo.The FragmentManagerStateHandler is a class that helps restoring fragments when a screen mode transition occurs.

Quando si eseguono transizioni della modalità schermo, il problema da affrontare consiste nel ricreare l'attività senza tuttavia avere la stessa interfaccia utente.The problem we are facing when we make screen mode transitions is that the activity will be recreated but the UI is not the same.

Ad esempio:For example:

  • Non è necessario ripristinare il frammento relativo allo schermo singolo quando si passa alla modalità doppio schermo.No need to restore the single-screen fragment when we transition to dual screen mode.
  • Non è necessario ripristinare i frammenti relativi al doppio schermo quando si passa alla modalità schermo singolo.No need to restore the dual-screen fragments when we transition to single screen mode.

Il componente rileverà automaticamente la modalità schermo impostata e, in base a quella, ripristinerà solo i frammenti necessari.The component will automatically detect the screen mode we are in and it will restore just the fragments we need, depending on the screen mode.

Importante

Il componente funziona solo con attività di AndroidX.The component only works with activities from AndroidX.

Modalità d'usoHow to use

class SampleApp : Application() {
    lateinit var surfaceDuoScreenManager: SurfaceDuoScreenManager

    override fun onCreate() {
        super.onCreate()
        surfaceDuoScreenManager = SurfaceDuoScreenManager.getInstance(this)
        FragmentManagerStateHandler.initialize(this, surfaceDuoScreenManager)
    }
}
class MainActivity : 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_main)

        when ((application as SampleApp).surfaceDuoScreenManager.screenMode) {
            ScreenMode.SINGLE_SCREEN -> {
                if (supportFragmentManager.findFragmentByTag(FRAGMENT_SINGLE_SCREEN) == null) {
                    supportFragmentManager.beginTransaction()
                        .replace(
                            R.id.first_container_id,
                            SingleScreenFragment(),
                            FRAGMENT_SINGLE_SCREEN
                        ).commit()
                }
            }
            ScreenMode.DUAL_SCREEN -> {
                if (supportFragmentManager.findFragmentByTag(FRAGMENT_DUAL_START) == null &&
                    supportFragmentManager.findFragmentByTag(FRAGMENT_DUAL_END) == null) {
                    supportFragmentManager.beginTransaction()
                        .replace(
                            R.id.first_container_id,
                            DualStartFragment(),
                            FRAGMENT_DUAL_START
                        ).commit()
                    supportFragmentManager.beginTransaction()
                        .replace(
                            R.id.second_container_id,
                            DualEndFragment(),
                            FRAGMENT_DUAL_END
                        ).commit()
                }
            }
        }
    }
}