Partager via


Gestionnaire d’écran Surface Duo

Attention

Ce composant est déprécié et n’est plus pris en charge.

Pour récupérer des informations sur la zone d’affichage et la fonctionnalité de pliage, vous devez utiliser le Gestionnaire de fenêtres Jetpack.

Vous pouvez également utiliser l’un de ces contrôles et dispositions double écran qui peuvent s’adapter automatiquement aux appareils double écran et pliables.

SurfaceDuoScreenManager est le protocole commun pour deux implémentations différentes du gestionnaire d’écran : l’une utilisant la bibliothèque Microsoft DisplayMask et l’autre utilisant la bibliothèque WindowManager de Google. Cette interface définit les méthodes que vous devez utiliser pour inscrire et désinscrire les écouteurs d’informations sur l’écran.

Pour pouvoir créer le gestionnaire d’écran, vous devez utiliser ScreenManagerProvider.getScreenManager(), qui va retourner l’instance singleton de l’implémentation de SurfaceDuoScreenManager. Avant d’appeler cette méthode, vous devez appeler ScreenManagerProvider.init(Application) à l’intérieur de votre Application.onCreate() pour initialiser l’instance singleton de SurfaceDuoScreenManager. Cet appel est obligatoire ; sinon, une exception IllegalStateException("SurfaceDuoScreenManager must be initialized inside Application#onCreate()") est levée. Une fois que vous avez l’instance de SurfaceDuoScreenManager, vous pouvez inscrire le rappel ScreenInfoListener en utilisant SurfaceDuoScreenManager.addScreenInfoListener(ScreenInfoListener?) pour être averti du changement de mode de l’écran. Gardez à l’esprit que vous pouvez aussi ajouter plusieurs écouteurs : vous devez donc les désinscrire en utilisant SurfaceDuoScreenManager.removeScreenInfoListener(ScreenInfoListener?) afin d’éviter les fuites de mémoire.

En outre, si vous avez décidé de gérer les modifications de configuration, vous devez appeler SurfaceDuoScreenManager.onConfigurationChanged(Configuration) à partir de votre Activity, sinon, le rappel ne sera pas déclenché.

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()
    }
}

Une autre option pour récupérer l’objet ScreenInfo sans devoir inscrire un rappel consiste à utiliser la méthode ScreenInfoProvider.getScreenInfo(Context). Gardez à l’esprit que vous devez appeler cette méthode une fois que la vue est attachée à la fenêtre ; sinon, certaines méthodes de ScreenInfo vont retourner null ou lever des exceptions.

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) {}
                })
            }
        }
    }
}

Si vous utilisez la bibliothèque Core Ktx, procédez comme suit :

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)
        }
    }
}