Condividi tramite


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 , e IsSeparatingmetodi per BoundsOcclusionType, Orientatione State.

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:

  1. Fare clic con il pulsante destro del mouse sulla Xamarin. Android progetto e scegliere Gestisci pacchetti NuGet...

  2. Cercare Xamarin.AndroidX.Window.WindowJava.

  3. 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

  1. 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; corrette using AndroidX.Window.Layout; vengano aggiunte alla parte superiore del file.

    Nota

    L'attività implementa IConsumeranche , vedere il passaggio 4 seguente per il codice per il Accept metodo richiesto da questa interfaccia.

  2. Inizializzare Window Manager nella sezione OnCreate dell'attività:

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            wit = new WindowInfoTrackerCallbackAdapter(WindowInfoTracker.Companion.GetOrCreate(this));
    
  3. 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);
        }
    }
    
  4. 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 di DisplayFeature elementi, una o più delle quali potrebbero essere istanze di FoldingFeature. Le istanze di funzionalità di riduzione dispongono di proprietà per e , e IsSeparatingmetodi per OcclusionTypeBounds, Orientatione State che è possibile eseguire query per prendere decisioni su come modificare il layout per il nuovo stato.

  5. In un OnStart override registrare il gestore e passare l'executor AddWindowLayoutInfoListener e un riferimento all'attività (perché implementa IConsumer).

    protected override void OnStart()
    {
        base.OnStart();
        wit.AddWindowLayoutInfoListener(this, runOnUiThreadExecutor(), this);
        // first `this` is the Activity context, second `this` is the IConsumer implementation
    }
    
  6. Ricordarsi di rimuovere il listener:

    protected override void OnStop()
    {
        base.OnStop();
        wit.RemoveWindowLayoutInfoListener(this);
    }
    
  7. 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:

Surface Duo showing Window Manager sample running, and showing device info on the screen

Risorse