Jetpack-Fenster-Manager für Xamarin

Tipp

Xamarin.Forms-Benutzer sollten auf die Xamarin.Forms.DualScreen NuGet für Surface Duo-Unterstützung verweisen, mit seinen DualScreenInfo und TwoPaneView Klassen.

Jetpack Window Manager ist für Entwickler vorgesehen, die mit Xamarin arbeiten. Android Projekte.

Der Jetpack-Fenster-Manager stellt eine Standard-API für die Arbeit mit allen faltbaren Geräten bereit. Sie enthält zwei wichtige Klassen:

  • DisplayFeature: Erkennt Unterbrechungen der fortlaufenden flachen Bildschirmoberfläche wie Scharniere oder Faltungen. Der Fenster-Manager gibt eine Sammlung von Anzeigefeatures aus einem Rückruf für Layoutänderungen zurück.
  • FoldingFeature: Stellt Informationen zu einem bestimmten Feature des Geräts bereit. Das Surface Duo verfügt zwar nur über eine Faltungsfunktion, es ist aber möglich, dass andere Geräte über mehr verfügen. Die FoldingFeature Klasse enthält Informationen zum Zustand dieses Teils des Geräts, mit Eigenschaften für Bounds und IsSeparatingMethoden für , und Methoden für OcclusionType, Orientationund State.

Beispiele mit Jetpack Window Manager sind im Surface-duo-sdk-xamarin-samples Repo verfügbar.

Hinweis

Die Xamarin.AndroidX.Window.WindowJava NuGet soll die Notwendigkeit ersetzen, die Xamarin.DuoSDK-NuGet zu Xamarin.Android-Apps hinzuzufügen.

Anstatt die Klasse zu verwendenScreenHelper, um zu bestimmen IsDualMode oder zu GetHingeBoundsDip()können, können Sie die Methoden und Eigenschaften für WindowInfoTracker und verwandte Klassen direkt verwenden.

Führen Sie die folgenden Anweisungen (aus dem Xamarin.Android aus, um sie in Ihrem Code zu verwendenWindowInfoTracker. Fenster-Manager-Beispiel-App):

Hinzufügen der Abhängigkeit

So fügen Sie die NuGet hinzu, die Jetpack Window Manager-Features bereitstellt:

  1. Klicken Sie mit der rechten Maustaste auf Ihr Xamarin. Android Projekt und wählen Sie "NuGet Pakete verwalten" aus...

  2. Suchen Sie nach Xamarin.AndroidX.Window.WindowJava.

  3. Wählen Sie die höchste Versionsnummer aus, die Ihrem Projekt hinzugefügt werden soll (1.0.0.7 ist die erste stabile Version der API).

Verwenden des Jetpack-Fenster-Managers in Ihrem Code

  1. Deklarieren Sie in der MainActivity-Klasse eine Variable für den Fensterinformations-Tracker:

    public class MainActivity : AppCompatActivity, IConsumer
    {
        WindowInfoTrackerCallbackAdapter wit;
    

    Stellen Sie sicher, dass die richtigen using AndroidX.Window.Layout; und using AndroidX.Window.Java.Layout; Anweisungen oben in der Datei hinzugefügt werden.

    Hinweis

    Die Aktivität implementiert IConsumerauch , siehe Schritt 4 unten für den Code für die Accept von dieser Schnittstelle erforderliche Methode.

  2. Initialisieren Sie den Fenster-Manager im OnCreate Ihrer Aktivität:

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            wit = new WindowInfoTrackerCallbackAdapter(WindowInfoTracker.Companion.GetOrCreate(this));
    
  3. Erstellen Sie jetzt eine Funktion, die eine IExecutor Implementierung zurückgibt, sodass wir sie als ersten Parameter bereitstellen und mithilfe dieser aufgerufen werden. Wir erstellen eine Funktion, die im Thread der Benutzeroberfläche ausgeführt wird. Sie können bei Bedarf jedoch eine Funktion erstellen, die nicht im Thread der Benutzeroberfläche ausgeführt wird.

    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. Definiere eine innere Klasse zur Verarbeitung des Rückrufs, wenn das Layout geändert werden muss. Die Aktivität sollte eine TextView mit dem Namen layoutChange aufweisen, damit diese Methode den angezeigten Text aktualisieren kann:

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

    Hinweis

    Die WindowLayoutInfo-Klasse verfügt über eine Auflistung von DisplayFeature-Elementen, von denen eins oder mehrere Instanzen von FoldingFeature sein können. Faltfeatureinstanzen verfügen über BoundsEigenschaften und IsSeparatingMethoden OcclusionTypeOrientationfür , und State sie können abfragen, um Entscheidungen darüber zu treffen, wie Sie Ihr Layout für den neuen Zustand anpassen.

  5. Registrieren Sie in einer OnStart Außerkraftsetzung den AddWindowLayoutInfoListener Handler, und übergeben Sie den Ausführenden und einen Verweis auf die Aktivität (da er implementiert).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. Denken Sie daran, den Listener zu entfernen:

    protected override void OnStop()
    {
        base.OnStop();
        wit.RemoveWindowLayoutInfoListener(this);
    }
    
  7. Beim Ausführen dieses Codes wird die Aktivität mit der aktuellen Geräteposition und den Anzeigefeatures aktualisiert (im Fall einer das Scharnier oder die Faltung überspannenden Darstellung). Fügen Sie dem Rückruf zusätzlichen Code hinzu, um nach zusätzlichen Informationen im FoldingFeature-Objekt zu suchen.

Beispiel

Das Fenster-Manager-Beispiel zeigt Geräteinformationen auf dem Bildschirm wie in diesem Screenshot dargestellt:

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

Ressourcen