Freigeben über


Surface Duo-Bildschirm-Manager

Achtung

Diese Komponente wurde als veraltet markiert und wird nicht mehr unterstützt.

Zum Abrufen von Informationen über den Anzeigebereich und das Faltungsfeature sollten Sie den Jetpack-Fenster-Manager verwenden.

Verwenden Sie alternativ eines dieser Dual-Screen-Steuerelemente und -Layouts, die sich automatisch an Dual-Screen- und Foldabe-Geräte anpassen können.

SurfaceDuoScreenManager ist das gemeinsame Protokoll für zwei verschiedene Implementierungen von Bildschirm-Managern, von denen eine die Microsoft DisplayMask-Bibliothek und die andere die Google WindowManager-Bibliothek verwendet. Diese Schnittstelle definiert Methoden, die Sie verwenden sollten, um Bildschirminfo-Listener zu registrieren bzw. deren Registrierung aufzuheben.

Zum Erstellen des Bildschirm-Managers sollten Sie ScreenManagerProvider.getScreenManager() verwenden, die die Singleton-Instanz der SurfaceDuoScreenManager-Implementierung zurückgibt. Bevor Sie diese Methode aufrufen, sollten Sie ScreenManagerProvider.init(Application) in Application.onCreate() aufrufen, um die Singleton-Instanz von SurfaceDuoScreenManager zu initialisieren. Dieser Aufruf ist erforderlich, ohne ihn wird eine IllegalStateException("SurfaceDuoScreenManager must be initialized inside Application#onCreate()")-Ausnahme ausgelöst. Nachdem Sie die Instanz von SurfaceDuoScreenManager erstellt haben, können Sie den ScreenInfoListener-Rückruf mithilfe von SurfaceDuoScreenManager.addScreenInfoListener(ScreenInfoListener?) registrieren, damit Sie bei einem Wechsel des Bildschirmmodus benachrichtigt werden. Denken Sie daran, dass Sie auch mehrere Listener hinzufügen können, daher sollten Sie ihre Registrierung mithilfe von SurfaceDuoScreenManager.removeScreenInfoListener(ScreenInfoListener?) aufheben, um Speicherlecks zu vermeiden.

Wenn Sie sich entschieden haben, die Konfigurationsänderungen zu verarbeiten, sollten Sie außerdem SurfaceDuoScreenManager.onConfigurationChanged(Configuration) aus Ihrer Activity aufrufen; andernfalls wird der Rückruf nicht ausgelöst.

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

Eine weitere Option zum Abrufen des ScreenInfo-Objekts ohne das Erfordernis, einen Rückruf zu registrieren, ist die Verwendung der Methode ScreenInfoProvider.getScreenInfo(Context). Beachten Sie, dass diese Methode aufgerufen werden sollte, nachdem die Ansicht dem Fenster zugeordnet wurde. Andernfalls geben einige Methoden von ScreenInfonull zurück oder lösen Ausnahmen aus.

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

Wenn Sie die Core Ktx-Bibliothek verwenden, gehen Sie folgendermaßen vor:

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