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