Jetpack Window Manager per Xamarin
Suggerimento
Gli utenti di Xamarin.Forms devono fare riferimento alla NuGet Xamarin.Forms.DualScreen per il supporto di Surface Duo, con le relative DualScreenInfo
classi eTwoPaneView
.
Jetpack Window Manager è destinato agli sviluppatori che lavorano con Xamarin. Android progetti.
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, mentre Surface Duo ha solo una funzionalità di riduzione, è possibile che altri dispositivi possano avere più. La
FoldingFeature
classe fornisce informazioni sullo stato di tale parte del dispositivo, con proprietà per e e , eIsSeparating
metodi perBounds
OcclusionType
,Orientation
eState
.
Gli esempi che usano Jetpack Window Manager sono disponibili nel repository surface-duo-sdk-xamarin-samples.
Nota
Il NuGet Xamarin.AndroidX.WindowJava è destinato a sostituire la necessità di aggiungere l'NuGet Xamarin.DuoSDK alle app Xamarin.Android.
Anziché usare la ScreenHelper
classe per determinare IsDualMode
o in GetHingeBoundsDip()
, è possibile usare direttamente i metodi e le proprietà sulle WindowInfoTracker
classi correlate.
Per usare WindowInfoTracker
nel codice, seguire le istruzioni seguenti (da Xamarin.Android App di esempio di Window Manager):
Aggiungere una dipendenza
Per aggiungere la NuGet che fornisce funzionalità di Jetpack Window Manager:
Fare clic con il pulsante destro del mouse sulla Xamarin. Android progetto e scegliere Gestisci pacchetti NuGet...
Cercare Xamarin.AndroidX.Window.WindowJava.
Scegliere il numero di versione più alto da aggiungere al progetto (1.0.0.7 è la prima versione stabile dell'API).
Usare Jetpack Window Manager nel codice
Nella classe MainActivity dichiarare una variabile per il localizzatore informazioni finestra:
public class MainActivity : AppCompatActivity, IConsumer { WindowInfoTrackerCallbackAdapter wit;
Assicurarsi che le istruzioni e
using AndroidX.Window.Java.Layout;
corretteusing AndroidX.Window.Layout;
vengano aggiunte alla parte superiore del file.Nota
L'attività implementa
IConsumer
anche , vedere il passaggio 4 seguente per il codice per ilAccept
metodo richiesto da questa interfaccia.Inizializzare Window Manager nella sezione
OnCreate
dell'attività:protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); wit = new WindowInfoTrackerCallbackAdapter(WindowInfoTracker.Companion.GetOrCreate(this));
Creare ora una funzione che restituisce un'implementazione
IExecutor
in modo che venga fornita al callback come primo parametro e che verrà richiamata usandola. Si creerà una funzione che viene eseguita nel thread dell'interfaccia utente, ma è possibile crearne una diversa che non venga eseguita in tale thread, se necessario.IExecutor runOnUiThreadExecutor() { return new MyExecutor(); } class MyExecutor : Java.Lang.Object, IExecutor { Handler handler = new Handler(Looper.MainLooper); public void Execute(IRunnable r) { handler.Post(r); } }
Definire una classe interna per gestire il callback quando il layout deve modificare. L'attività deve avere un controllo TextView denominato
layoutChange
in modo che questo metodo possa aggiornare il testo visualizzato:public void Accept(Java.Lang.Object newLayoutInfo) // Object will be WindowLayoutInfo { var newLayoutInfo = (newLayoutInfo as WindowLayoutInfo); // have to cast before use layoutChange.Text = newLayoutInfo.ToString(); configurationChanged.Text = "One logic/physical display - unspanned"; foreach (var displayFeature in newLayoutInfo.DisplayFeatures) { var foldingFeature = displayFeature.JavaCast<IFoldingFeature>(); if (foldingFeature != null) { alignViewToDeviceFeatureBoundaries(newLayoutInfo); if (foldingFeature.GetOcclusionType() == FoldingFeatureOcclusionType.None) { configurationChanged.Text = "App is spanned across a fold"; } if (foldingFeature.GetOcclusionType() == FoldingFeatureOcclusionType.Full) { configurationChanged.Text = "App is spanned across a hinge"; } configurationChanged.Text += "\nIsSeparating: " + foldingFeature.IsSeparating + "\nOrientation: " + foldingFeature.Orientation // FoldingFeatureOrientation.Vertical or Horizontal + "\nState: " + foldingFeature.State; // FoldingFeatureState.Flat or State.HalfOpened } else { Log.Info(TAG, "DisplayFeature is not a fold/hinge"); } } }
Nota
La
WindowLayoutInfo
classe ha una raccolta diDisplayFeature
elementi, una o più delle quali potrebbero essere istanze diFoldingFeature
. Le istanze di funzionalità di riduzione dispongono di proprietà per e , eIsSeparating
metodi perOcclusionType
Bounds
,Orientation
eState
che è possibile eseguire query per prendere decisioni su come modificare il layout per il nuovo stato.In un
OnStart
override registrare il gestore e passare l'executorAddWindowLayoutInfoListener
e un riferimento all'attività (perché implementaIConsumer
).protected override void OnStart() { base.OnStart(); wit.AddWindowLayoutInfoListener(this, runOnUiThreadExecutor(), this); // first `this` is the Activity context, second `this` is the IConsumer implementation }
Ricordarsi di rimuovere il listener:
protected override void OnStop() { base.OnStop(); wit.RemoveWindowLayoutInfoListener(this); }
Quando viene eseguito questo codice, l'attività verrà aggiornata con la posizione del dispositivo e le funzionalità di visualizzazione correnti, se la visualizzazione si estende attraverso la piegatura o la cerniera. Aggiungere codice aggiuntivo al callback per verificare la presenza di informazioni aggiuntive nell'oggetto
FoldingFeature
.
Esempio
L'esempio di Window Manager mostra le informazioni sul dispositivo sullo schermo, come illustrato in questa schermata: