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