Jetpack Window Manager per dispositivi pieghevoli
Jetpack Window Manager offre un'API standard per l'uso di tutti i dispositivi piegabili. Contiene due classi importanti:
- DisplayFeature: identifica eventuali discontinuità presenti sulla superficie dello schermo piatto, ad esempio cerniere o piegature. Window Manager restituirà una raccolta di funzionalità di visualizzazione da un callback di modifica del layout.
- FoldingFeature : fornisce informazioni su una funzionalità specifica del dispositivo. Anche se Surface Duo ha una sola funzionalità di riduzione, è possibile che altri dispositivi abbiano più dispositivi.
Una guida simile è disponibile in Android Foldable Codelab. Per altre informazioni sullo sviluppo per le riduzioni, vedere la documentazione di Android. Gli esempi del team Android sono disponibili anche in GitHub. Le note sulla versione di Jetpack registrano le modifiche apportate a Window Manager non appena vengono aggiornate.
Suggerimento
I controlli e le classi helper disponibili nella libreria per dispositivi a doppio schermo Surface Duo funzionano con Window Manager. Seguire le istruzioni per aggiungere i pacchetti corretti al progetto dell'app.
Per usare Window Manager direttamente nel codice, seguire le istruzioni seguenti:
Aggiungere le dipendenze
Assicurarsi di avere il
mavenCentral()
repository nel file build.gradle di primo livello:allprojects { repositories { google() mavenCentral() } }
Verificare che e
targetSdkVersion
siano impostati sull'APIcompileSdkVersion
31 o versione successiva nel file build.gradle a livello di modulo:android { compileSdkVersion 31 defaultConfig { targetSdkVersion 31 } ... }
Aggiungere le dipendenze seguenti al file build.gradle a livello di modulo:
dependencies { implementation "androidx.window:window:1.0.0" implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.0' }
Usare Window Manager nel codice Kotlin
Quando si accede alle proprietà di Window Manager nei progetti Kotlin, è importante configurare il flusso corretto di informazioni. In caso contrario, potresti ricevere un numero eccessivo di aggiornamenti degli eventi e le prestazioni dell'app potrebbero essere influenzate.
Per inizializzare e usare un WindowInfoTracker
oggetto, seguire questa procedura:
Nella classe MainActivity creare una variabile per .
WindowInfoTracker
Assicurarsi cheimport androidx.window.layout.WindowInfoTracker
venga aggiunto all'inizio del file.class MainActivity : AppCompatActivity() { private lateinit var windowInfoTracker: WindowInfoTracker
Inizializzare nel
WindowInfoTracker
metodo dell'attivitàonCreate
e configurare un flusso per raccogliere informazioni dallawindowLayoutInfo
proprietà .override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Initialize the window manager windowInfoTracker = WindowInfoTracker.getOrCreate(this@MainActivity) // Set up a flow lifecycleScope.launch(Dispatchers.Main) { lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { windowInfoTracker.windowLayoutInfo(this@MainActivity) .collect { // Check FoldingFeature properties here } } } }
Assicurarsi che queste importazioni vengano aggiunte anche all'inizio del file:
import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch
Aggiungere il codice per controllare il flusso per verificare le
WindowLayoutInfo
proprietà delle funzionalità di riduzione. Quando questo codice viene eseguito, l'attività verrà aggiornata con il comportamento del dispositivo corrente e le funzionalità di visualizzazione (se si estende su una piega o una cerniera).Nel frammento di codice seguente l'attività visualizza testo diverso in base alle proprietà di un oggetto
FoldingFeature
.In questo esempio è presente un controllo TextView denominato
layout_change_text
che mostra il tipo di occlusione eisSeparating
il valore per le funzionalità di riduzione rilevate.override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) windowInfoTracker = WindowInfoTracker.getOrCreate(this@MainActivity) lifecycleScope.launch(Dispatchers.Main) { lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { windowInfoTracker.windowLayoutInfo(this@MainActivity) .collect { newLayoutInfo -> layout_change_text.text = "No display features detected" for (displayFeature : DisplayFeature in newLayoutInfo.displayFeatures) { if (displayFeature is FoldingFeature && displayFeature.occlusionType == FoldingFeature.OcclusionType.NONE) { layout_change_text.text = "App is spanned across a fold, " + "isSeparating = ${displayFeature.isSeparating}" } if (displayFeature is FoldingFeature && displayFeature.occlusionType == FoldingFeature.OcclusionType.FULL) { layout_change_text.text = "App is spanned across a hinge, " + "isSeparating = ${displayFeature.isSeparating}" } } } } } }
Proprietà delle funzionalità di riduzione
La WindowLayoutInfo
classe ha una raccolta di DisplayFeature
elementi, una o più delle quali possono essere istanze della classe FoldingFeature.
Le funzionalità di riduzione hanno le proprietà seguenti:
bounds
- coordinate del rettangolo di delimitazione di una caratteristica di riduzioneocclusionType
- se una funzionalità di riduzione nasconde il contenuto (FULL
oNONE
)orientation
- orientamento di una caratteristica di riduzione (HORIZONTAL
oVERTICAL
)state
- angolo di una caratteristica di riduzione (HALF_OPENED
oFLAT
)isSeparating
- se una caratteristica di riduzione separa l'area di visualizzazione in due sezioni distinte
È possibile eseguire una query su queste proprietà per prendere decisioni su come modificare il layout dopo le modifiche alla configurazione.
isSeparating
Quando si decide dove posizionare i controlli o il numero di riquadri di contenuto da visualizzare, utilizzare la proprietà isSeparating . Questo campo garantisce che l'app offra la migliore esperienza utente in tutti i dispositivi piegabili:
- Per i dispositivi a doppio schermo, questo sarà sempre vero quando un'app viene estesa attraverso la cerniera
- Per altri dispositivi piegabili, questo sarà vero solo quando lo stato è
HALF_OPENED
, ad esempio quando un dispositivo si trova nella posizione di tabella superiore
Usa la isSeparating
proprietà per decidere se adattare il layout dell'interfaccia utente dell'app per un dispositivo piegabile o usa l'interfaccia utente predefinita quando non è presente alcuna separazione:
private fun updateCurrentLayout(newLayoutInfo: WindowLayoutInfo) {
for (displayFeature in newLayoutInfo.displayFeatures) {
val foldFeature = displayFeature as? FoldingFeature
foldFeature?.let {
if (it.isSeparating) {
// The content is separated by the FoldingFeature.
// Here is where you should adapt your UI.
} else {
// The content is not separated.
// Users can see and interact with your UI properly.
}
}
}
}
Per un esempio più dettagliato di come usare questo campo, vedere questo esempio isSeparating.
Google fornisce anche documentazione ed esempi correlati a questa proprietà come parte delle linee guida per schermi di grandi dimensioni e piegabili.
Esempi
Il repository surface-duo-jetpack-window-manager-samples GitHub contiene diversi esempi di Kotlin che illustrano diversi modelli di esperienza utente a doppio schermo creati usando Jetpack Window Manager e il sistema di visualizzazione tradizionale.
Il repository surface-duo-compose-samples GitHub include anche esempi di Kotlin a doppio schermo che usano Jetpack Window Manager, ma in questi esempi l'interfaccia utente è compilata con Jetpack Compose.
API Java
Fare riferimento al post di blog di Jetpack Window Manager con Java e a questo esempio Java per informazioni su come accedere alla WindowInfoTracker
classe tramite .WindowInfoTrackerCallbackAdapter