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ürBounds
undIsSeparating
Methoden für , und Methoden fürOcclusionType
,Orientation
undState
.
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:
Klicken Sie mit der rechten Maustaste auf Ihr Xamarin. Android Projekt und wählen Sie "NuGet Pakete verwalten" aus...
Suchen Sie nach Xamarin.AndroidX.Window.WindowJava.
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
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;
undusing AndroidX.Window.Java.Layout;
Anweisungen oben in der Datei hinzugefügt werden.Hinweis
Die Aktivität implementiert
IConsumer
auch , siehe Schritt 4 unten für den Code für dieAccept
von dieser Schnittstelle erforderliche Methode.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));
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); } }
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 vonDisplayFeature
-Elementen, von denen eins oder mehrere Instanzen vonFoldingFeature
sein können. Faltfeatureinstanzen verfügen überBounds
Eigenschaften undIsSeparating
MethodenOcclusionType
Orientation
für , undState
sie können abfragen, um Entscheidungen darüber zu treffen, wie Sie Ihr Layout für den neuen Zustand anpassen.Registrieren Sie in einer
OnStart
Außerkraftsetzung denAddWindowLayoutInfoListener
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 }
Denken Sie daran, den Listener zu entfernen:
protected override void OnStop() { base.OnStop(); wit.RemoveWindowLayoutInfoListener(this); }
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: