Fensterverwaltung

ChromeOS unterstützt Android-Apps in mehreren Fenstern. Das System rendert Apps in Fenstercontainern, deren Größe durch den Formfaktor des Geräts bestimmt wird, wie in Abbildung 1 dargestellt.

Abbildung 1: Ein App-Fenster auf verschiedenen Geräten

Es ist wichtig, Layouts zu entwerfen, die für verschiedene Bildschirmgrößen funktionieren. Wenn du den Android-Richtlinien zur Unterstützung verschiedener Bildschirmgrößen folgst, funktioniert deine App auch unter ChromeOS einwandfrei.

Auf dieser Seite wird beschrieben, wie Sie dafür sorgen, dass das Fenster Ihrer App korrekt gestartet, die Größe gleichmäßig angepasst und der gesamte Inhalt angezeigt wird, wenn sich die Größe ändert.

Ursprüngliche Größe der Markteinführung

Apps können ihre anfängliche Startgröße auf folgende Arten anfordern:

  • Verwenden Sie eine Startgröße nur in Desktop-Umgebungen. Dies hilft dem Fenstermanager, Ihnen die richtigen Grenzen und die richtige Ausrichtung zu geben. Wenn du im Desktopmodus Einstellungen angeben möchtest, füge in <activity> die folgenden Meta-Tags ein:
<meta-data android:name="WindowManagerPreference:FreeformWindowSize"
           android:value="[phone|tablet|maximize]" />
<meta-data android:name="WindowManagerPreference:FreeformWindowOrientation"
           android:value="[portrait|landscape]" />
  • Verwenden Sie statische Startgrenzen. Verwenden Sie <layout> im Manifesteintrag Ihrer Aktivität, um eine „feste“ Startgröße wie im folgenden Beispiel anzugeben:
<layout android:defaultHeight="500dp"
            android:defaultWidth="600dp"
            android:gravity="top|end"
            android:minHeight="450dp"
            android:minWidth="300dp" />
  • Dynamische Startgrenzen verwenden. Eine Aktivität kann beim Erstellen einer neuen Aktivität ActivityOptions.setLaunchBounds(Rect) erstellen und verwenden. Durch Angabe eines leeren Rechtecks kann Ihre Anwendung maximiert werden.

Fenstergröße anpassen

In ChromeOS können Nutzer die Größe des App-Fensters wie gewohnt ändern, indem sie die untere rechte Ecke ziehen (siehe Abbildung 2).

Abbildung 2: Ein App-Fenster mit anpassbarer Größe.

Es gibt zwei Möglichkeiten, die Fenstergröße bei Verwendung der Klasse View anzupassen:

  • Reagieren Sie dynamisch auf Konfigurationsänderungen, indem Sie onConfigurationChanged(..) aufrufen. Sie können dem Manifest der Aktivität beispielsweise android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout" hinzufügen. Weitere Informationen finden Sie unter Konfigurationsänderungen verarbeiten.
  • Lassen Sie das System die Aktivität neu starten. Implementieren Sie in diesem Fall onSaveInstanceState und verwenden Sie die ViewModel-Architekturkomponente, um den zuvor gespeicherten Status wiederherzustellen.

Bei Verwendung von Jetpack Compose hängt das Verhalten der Größenänderung davon ab, wie Ihre Aktivität konfiguriert ist. Wenn Änderungen dynamisch verarbeitet werden, wird bei einer Änderung der Fenstergröße eine Neuzusammensetzung ausgelöst. Wird die Aktivität vom System neu gestartet, erfolgt nach dem Neustart eine anfängliche Zusammensetzung. In jedem Fall ist es wichtig, Layouts für die Funktion „Compose“ zu erstellen, die sich an die sich ändernde Fenstergröße anpassen. Gehen Sie nicht von festen Größen aus.

Fensterabmessungen

Lassen Sie Ihre Aktivitäten bei jedem Start die Fensterabmessungen lesen und ihren Inhalt gemäß der aktuellen Konfiguration anordnen.

Rufen Sie zum Ermitteln der aktuellen Konfiguration getResources().getConfiguration() für die aktuelle Aktivität auf. Verwenden Sie nicht die Konfiguration der Hintergrundaktivität oder der Systemressource. Die Hintergrundaktivität hat keine Größe und die Systemkonfiguration kann mehrere Fenster mit widersprüchlichen Größen und Ausrichtungen enthalten, sodass keine verwendbaren Daten extrahiert werden können.

Hinweis: Die window-Größe und die screen-Größe sind nicht identisch. Verwenden Sie Activity.getResources().getConfiguration().screenWidth und Activity.getResources().getConfiguration().screenHeight, um die Fenstergröße in DP abzurufen. Sie müssen die Bildschirmgröße wahrscheinlich nicht verwenden.

Inhaltsgrenzen

Die Inhaltsgrenzen eines Fensters können sich nach der Größenanpassung ändern. Beispielsweise kann sich der Bereich innerhalb des Fensters, der von der App verwendet wird, ändern, wenn das Fenster zu groß wird, um auf den Bildschirm zu passen. Beachten Sie die folgenden Richtlinien:

  • Apps, die den Android-Layoutprozess nutzen, werden automatisch auf dem verfügbaren Platz angeordnet.
  • Systemeigene Apps müssen den verfügbaren Bereich lesen und Größenänderungen beobachten, um zu vermeiden, dass UI-Elemente unzugänglich sind. Rufen Sie die folgenden Methoden auf, um die anfänglich verfügbare Größe für diese Oberfläche zu ermitteln:

    • NativeActivity.mLastContent[X/Y/Width/Height]()
    • findViewById(android.R.id.content).get[Width/Height]()

    Eine kontinuierliche Überwachung kann mit einem Beobachter erfolgen:

    • NativeActivity.onContentRectChangedNative()
    • NativeActivity.onGlobalLayout()
    • view.addOnLayoutChangeListener(findViewById(android.R.id.content)) einen Listener hinzufügen

    Wenn die App das Artwork vorskaliert, musst du dies jedes Mal tun, wenn sich die Auflösung ändert.

Größenanpassung im freien Format

In ChromeOS kann die Größe jedes Fensters frei angepasst werden: Der Nutzer kann die Breite, Höhe und Position eines Fensters auf dem Bildschirm ändern. Bei der Entwicklung vieler Android-Apps wird keine Größenanpassung im freien Format berücksichtigt. Bedenken Sie diese Punkte:

  • Die Bildschirmposition kann sich ändern. Verwenden Sie das System immer, um Fenster-zu-Bildschirm- und Bildschirm-zu-Fenster-Koordinatentransformationen durchzuführen.
  • Wenn Sie das Ansichtssystem von Android verwenden, ändert sich Ihr Fensterlayout automatisch, wenn sich seine Größe ändert.
  • Wenn Sie das Ansichtssystem nicht verwenden und die Oberfläche übernehmen, muss Ihre App Größenänderungen selbst vornehmen.
  • Verwenden Sie für native Apps das mLastContent-Attribut oder die Inhaltsansicht, um die Anfangsgröße zu bestimmen.
  • Wenn die App ausgeführt wird, warten Sie auf onContentRectChangedNative- oder onGlobalLayout-Ereignisse, um auf Größenänderungen zu reagieren.
  • Wenn sich die Größe der App ändert, kannst du Layouts und Artwork neu skalieren oder neu laden und die Eingabebereiche aktualisieren.

Vollbildmodus

Der Vollbildmodus funktioniert genauso wie auf dem Standard-Android-Gerät. Wenn das Fenster nicht den ganzen Bildschirm abdeckt, werden Vollbildanfragen (d. h. alle System-UI-Elemente ausgeblendet) ignoriert. Wenn die App maximiert ist, werden die normalen Methoden, Layouts und Funktionen für den Vollbildmodus ausgeführt. Dadurch werden die System-UI-Elemente (Fenstersteuerungsleiste und die Ablage) ausgeblendet.

Bildschirmausrichtung

Die gängigste Ausrichtung für Android-Apps ist das Hochformat, da die meisten Smartphones so gehalten werden. Das Hochformat ist gut für Smartphones, aber schlecht für Laptops und Tablets, da hier das Querformat bevorzugt wird. Die besten Ergebnisse für Ihre App erzielen Sie, wenn Sie beide Ausrichtungen unterstützen.

Bei einigen Android-Apps wird davon ausgegangen, dass der Rotationswert Surface.ROTATION_0 beträgt, wenn ein Gerät im Hochformat gehalten wird. Dies gilt möglicherweise für die meisten Android-Geräte. Befindet sich die Anwendung jedoch in einem bestimmten ARC-Modus, ist der Rotationswert für die Hochformatausrichtung möglicherweise nicht Surface.ROTATION_0.

Verwenden Sie die Display.getRotation()-Methode und tauschen Sie die Achse entsprechend aus, um beim Lesen des Beschleunigungsmessers oder ähnlicher Sensoren einen genauen Rotationswert zu erhalten.

Stammaktivität und -orientierung

Ein Chromebook-Fenster besteht aus einem Stapel von Aktivitätsfenstern. Jedes Fenster im Stapel hat dieselbe Größe und Ausrichtung.

Plötzliche Ausrichtungs- und Größenänderungen sind in einer Desktopumgebung verwirrend. Der Chromebook-Fenstermanager vermeidet dies auf eine Weise, die dem Side-by-Side-Modus von Android ähnelt: Die Aktivität am unteren Rand des Stapels steuert die Attribute aller Aktivitäten darüber. Dies kann zu unerwarteten Situationen führen, in denen eine neu gestartete Aktivität im Hochformat, bei der die Größe nicht geändert werden kann, ins Querformat und dessen Größe geändert werden kann.

Hier wirkt sich der Gerätemodus darauf aus: Im Tabletmodus ist die Ausrichtung nicht gesperrt und jedes Fenster behält seine eigene Ausrichtung bei, wie es unter Android üblich ist.

Ausrichtungsrichtlinien

Beachten Sie bei der Ausrichtung die folgenden Richtlinien:

  • Wenn Sie nur eine Ausrichtung unterstützen, fügen Sie die Informationen zum Manifest hinzu, damit der Fenstermanager sie kennt, bevor die Anwendung gestartet wird. Geben Sie dabei nach Möglichkeit auch die Sensorausrichtung an. Chromebooks sind oft Convertibles und eine auf dem Kopf stehende App ist nicht nutzerfreundlich.
  • Versuchen Sie, nur eine ausgewählte Ausrichtung zu verwenden. Vermeiden Sie es, eine Ausrichtung im Manifest anzufordern und eine andere später programmatisch festzulegen.
  • Seien Sie vorsichtig, wenn Sie die Ausrichtung basierend auf der Fenstergröße ändern. Der Nutzer bleibt möglicherweise in einem kleinen Fenster im Hochformat hängen und kann nicht mehr zu einem größeren Fenster im Querformat zurückkehren.
  • In Chrome gibt es Fenstersteuerelemente, mit denen Sie zwischen allen verfügbaren Layouts wechseln können. Wenn du die richtige Ausrichtungsoption auswählst, kannst du dafür sorgen, dass der Nutzer nach dem Starten der App das richtige Layout hat. Wenn eine App im Hoch- und Querformat verfügbar ist, verwende sie nach Möglichkeit standardmäßig im Querformat. Nachdem diese Option festgelegt wurde, wird sie pro App gespeichert.
  • Vermeiden Sie unnötige Ausrichtungsänderungen. Wenn beispielsweise die Aktivitätsausrichtung das Hochformat ist, die Anwendung aber zur Laufzeit setRequestedOrientation(LANDSCAPE) aufruft, führt dies zu einer unnötigen Größenanpassung des Fensters, was für den Nutzer ärgerlich ist und die Anwendung möglicherweise neu starten kann, die von der Anwendung nicht verarbeitet werden kann. Es ist besser, die Ausrichtung einmal festzulegen, z. B. im Manifest, und nur bei Bedarf zu ändern.

Weitere Überlegungen

Bei der Arbeit mit Android-Apps unter ChromeOS sollten Sie außerdem Folgendes beachten:

  • Rufe finish() nicht in der onDestroy-Methode deiner Aktivität auf. Dadurch wird die App bei der Größenänderung geschlossen und nicht neu gestartet.
  • Verwenden Sie keine nicht kompatiblen Fenstertypen wie TYPE_KEYGUARD und TYPE_APPLICATION_MEDIA.
  • Sorgen Sie für einen schnellen Neustart von Aktivitäten, indem Sie Objekte, die zuvor zugewiesen wurden, im Cache speichern.
  • Wenn du nicht möchtest, dass der Nutzer die Größe der App anpasst, gib in der Manifestdatei android:resizeableActivity=false an.
  • Testen Sie Ihre Anwendung, um sicherzustellen, dass Änderungen der Fenstergröße angemessen verarbeitet werden.