Condividi tramite


Gestione dello schermo di Surface Duo

Attenzione

Questo componente è stato deprecato e non è più supportato.

Per recuperare informazioni sull'area di visualizzazione e sulla funzionalità di ripiegamento, è necessario usare Jetpack Window Manager.

In alternativa, usare uno di questi controlli e layout a doppio schermo che possono adattarsi automaticamente ai dispositivi a doppio schermo e foldabe.

SurfaceDuoScreenManager è il protocollo comune per due diverse implementazioni della gestione dello schermo: una usa la libreria della maschera di visualizzazione di Microsoft e l'altra usa la libreria di gestione della finestra di Google. Questa interfaccia definisce i metodi che è necessario usare per registrare e annullare la registrazione di listener di informazioni sullo schermo.

Per creare la gestione dello schermo, è necessario usare ScreenManagerProvider.getScreenManager(), che restituirà l'istanza singleton dell'implementazione di SurfaceDuoScreenManager. Prima di chiamare questo metodo, è necessario chiamare ScreenManagerProvider.init(Application) in Application.onCreate() per inizializzare l'istanza singleton di SurfaceDuoScreenManager. Questa chiamata è obbligatoria. In caso contrario, verrà generata un'eccezione IllegalStateException("SurfaceDuoScreenManager must be initialized inside Application#onCreate()"). Dopo aver creato l'istanza di SurfaceDuoScreenManager, è possibile registrare il ScreenInfoListener callback SurfaceDuoScreenManager.addScreenInfoListener(ScreenInfoListener?) usando per ricevere una notifica quando è stata modificata la modalità schermo. Tenere presente che è anche possibile aggiungere più listener, è quindi consigliabile annullarne la registrazione usando SurfaceDuoScreenManager.removeScreenInfoListener(ScreenInfoListener?) per evitare perdite di memoria.

Inoltre, se si è deciso di gestire le modifiche di configurazione, SurfaceDuoScreenManager.onConfigurationChanged(Configuration)Activityè necessario chiamare da ; in caso contrario, il callback non verrà attivato.

class SampleApp : Application() {
    override fun onCreate() {
        super.onCreate()
        ScreenManagerProvider.init(this)
    }
}
class SampleActivity : AppCompatActivity(), ScreenInfoListener {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sample)
    }

    override fun onScreenInfoChanged(screenInfo: ScreenInfo) {
        if (screenInfo.isDualMode()) {
            // TODO: Add dual-screen behavior.
        } else {
            // TODO: Add single-screen behavior.
        }
    }

    override fun onResume() {
        super.onResume()
        ScreenManagerProvider.getScreenManager().addScreenInfoListener(this)
    }

    override fun onPause() {
        super.onPause()
        ScreenManagerProvider.getScreenManager().removeScreenInfoListener(this)
    }

    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        ScreenManagerProvider.getScreenManager().onConfigurationChanged()
    }
}

Un'altra opzione per recuperare l'oggetto ScreenInfo senza la necessità di registrare un callback consiste nell'usare il metodo ScreenInfoProvider.getScreenInfo(Context). Tenere presente che è necessario chiamare questo metodo dopo che la visualizzazione viene collegata alla finestra. In caso contrario, alcuni metodi di ScreenInfo restituiranno null o genereranno eccezioni.

class SampleActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sample)

        window?.decorView?.rootView?.let { rootView ->
            if (ViewCompat.isAttachedToWindow(rootView)) {
                val screenInfo = ScreenInfoProvider.getScreenInfo(this)
            } else {
                rootView.addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener {
                    override fun onViewAttachedToWindow(view: View) {
                        rootView.removeOnAttachStateChangeListener(this)
                        val screenInfo = ScreenInfoProvider.getScreenInfo(this)
                    }

                    override fun onViewDetachedFromWindow(view: View) {}
                })
            }
        }
    }
}

Se si usa la libreria Core Ktx, eseguire quanto segue:

class SampleActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sample)

        window?.decorView?.rootView?.doOnAttach {
            val screenInfo = ScreenInfoProvider.getScreenInfo(this)
        }
    }
}