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 (siehe Abbildung 1).

Ein App-Fenster auf verschiedenen Geräten.
Abbildung 1: Hier steht die Bildunterschrift.

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

Es ist wichtig, Layouts zu entwerfen, die für verschiedene Bildschirmgrößen geeignet sind. Wenn Sie die Android-Richtlinien zur Unterstützung verschiedener Bildschirmgrößen befolgen, funktioniert Ihre App auch unter ChromeOS gut.

Auf dieser Seite erfahren Sie, wie Sie dafür sorgen, dass das Fenster Ihrer App korrekt gestartet wird, die Größe reibungslos angepasst wird und alle Inhalte angezeigt werden, wenn sich die Größe ändert.

Größe beim ersten Start

Apps können ihre ursprüngliche Startgröße auf folgende Weise anfordern:

  • Startgröße nur in Desktopumgebungen verwenden. Hierdurch kann dir der Fenstermanager die richtigen Begrenzungen und die richtige Ausrichtung liefern. Wenn Sie im Desktopmodus Einstellungen angeben möchten, fügen Sie die folgenden Meta-Tags in den <activity> ein:

    &lt;meta-data android:name=&#34;WindowManagerPreference:FreeformWindowSize&#34;
               android:value=&#34;[phone|tablet|maximize]&#34; /&gt;
    &lt;meta-data android:name=&#34;WindowManagerPreference:FreeformWindowOrientation&#34;
               android:value=&#34;[portrait|landscape]&#34; /&gt;
    
  • Verwenden Sie statische Startgrenzen. Verwende <layout> innerhalb des Manifesteintrags deiner Aktivität, um eine „feste“ Anfangsgröße anzugeben, wie im folgenden Beispiel:

    &lt;layout android:defaultHeight=&#34;500dp&#34;
                android:defaultWidth=&#34;600dp&#34;
                android:gravity=&#34;top|end&#34;
                android:minHeight=&#34;450dp&#34;
                android:minWidth=&#34;300dp&#34; /&gt;
    
  • Verwenden Sie dynamische Startgrenzen. Eine Aktivität kann beim Erstellen einer neuen Aktivität ActivityOptions.setLaunchBounds(Rect) erstellen und verwenden. Durch das Festlegen eines leeren Rechtecks lässt sich deine App maximieren.

Fenstergröße ändern

Unter ChromeOS können Nutzer das Fenster einer App auf die übliche Weise vergrößern oder verkleinern, indem sie die rechte untere Ecke ziehen (siehe Abbildung 2).

Abbildung 2: Hier steht die Bildunterschrift.

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

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

  • Reagieren Sie dynamisch auf Konfigurationsänderungen, indem Sie onConfigurationChanged(..) aufrufen. Sie können beispielsweise android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout" dem Manifest der Aktivität hinzufügen. Weitere Informationen zum Verarbeiten von Konfigurationsänderungen 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 Zustand wiederherzustellen.

Wenn Sie Jetpack Compose verwenden, hängt das Verhalten beim Ändern der Größe davon ab, wie Ihre Aktivität konfiguriert ist. Wenn Änderungen dynamisch verarbeitet werden, wird bei einer Änderung der Fenstergröße eine Neukomposition ausgelöst. Wenn die Aktivität vom System neu gestartet wird, erfolgt nach dem Neustart eine erste Komposition. In jedem Fall ist es wichtig, Compose-Layouts zu erstellen, die sich an die sich ändernden Fenstergrößen anpassen. Gehen Sie nicht von festen Größen aus.

Fensterabmessungen

Lassen Sie Ihre Aktivitäten bei jedem Start ihre Fensterdimensionen lesen und ordnen Sie ihre Inhalte entsprechend der aktuellen Konfiguration an.

Rufen Sie getResources().getConfiguration() für die aktuelle Aktivität auf, um die aktuelle Konfiguration zu ermitteln. Verwende 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 verwertbaren Daten extrahiert werden können.

Die Fenstergröße und die Bildschirmgröße sind nicht identisch. Verwende Activity.getResources().getConfiguration().screenWidth und Activity.getResources().getConfiguration().screenHeight, um die Fenstergröße in DP abzurufen. Sie müssen die Bildschirmgröße wahrscheinlich nie verwenden.

Inhaltsgrenzen

Die Inhaltsgrenzen eines Fensters können sich nach dem Ändern der Größe ändern. Beispielsweise kann sich der Bereich innerhalb des Fensters, der von der App verwendet wird, ändern, wenn das Fenster zu groß für den Bildschirm wird. Beachten Sie Folgendes:

  • 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 erkennen, um zu vermeiden, dass UI-Elemente unzugänglich sind. Rufen Sie die folgenden Methoden auf, um die anfängliche 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]()

    Kontinuierliches Monitoring kann mit einem Beobachter erfolgen:

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

    Wenn die App das Artwork vor dem Skalieren bearbeitet, muss dies jedes Mal erfolgen, wenn sich die Auflösung ändert.

Größenanpassung im freien Format

Unter ChromeOS kann die Größe jedes Fensters frei geändert werden. Nutzer können die Breite, Höhe und Position eines Fensters auf dem Bildschirm anpassen. Viele Android-Apps wurden nicht für die kostenlose Größenanpassung entwickelt. Berücksichtigen Sie die folgenden Probleme:

  • Die Bildschirmposition kann sich ändern. Verwende immer das System, um Koordinatentransformationen von Fenster zu Bildschirm und von Bildschirm zu Fenster durchzuführen.
  • Wenn du das Anzeigesystem von Android verwendest, ändert sich das Fensterlayout automatisch, wenn sich die Größe ändert.
  • Wenn du es nicht verwendest und die Oberfläche übernimmst, muss deine App die Größenänderungen selbst vornehmen.
  • Verwenden Sie für native Apps die mLastContent-Elemente oder die Inhaltsansicht, um die Anfangsgröße zu ermitteln.
  • Wenn die App ausgeführt wird, sollten Sie auf die Ereignisse onContentRectChangedNative oder onGlobalLayout hören, um auf Größenänderungen zu reagieren.
  • Wenn sich die Größe der App ändert, müssen Sie Layouts und Grafiken neu skalieren oder neu laden und Eingabebereiche aktualisieren.

Vollbildmodus

Der Vollbildmodus funktioniert genauso wie auf einem standardmäßigen Android-Gerät. Wenn das Fenster nicht den gesamten Bildschirm abdeckt, werden Anfragen für das Vollbild (das die gesamte System-UI verdecken würde) ignoriert. Wenn die App maximiert ist, werden die normalen Vollbildmethoden, ‑layouts und ‑funktionen ausgeführt. Dadurch werden die System-UI-Elemente (Fenstersteuerungsleiste und Ablage) ausgeblendet.

Bildschirmausrichtung

Die häufigste Ausrichtung für eine Android-App ist das Hochformat, da die meisten Smartphones so gehalten werden. Das Hochformat eignet sich zwar gut für Smartphones, aber nicht für Laptops und Tablets, auf denen das Querformat bevorzugt wird. Wenn du aus deiner App das Beste herausholen willst, solltest du beide Ausrichtungen unterstützen.

Für einige Android-Apps ist der Rotationswert immer Surface.ROTATION_0, wenn ein Gerät im Hochformat genutzt wird. Das mag vielleicht auf die meisten Android-Geräte zutreffen. Ist die App allerdings in einem bestimmten ARC-Modus, dann ist der Rotationswert für die Hochformatausrichtung möglicherweise nicht Surface.ROTATION_0.

Wenn du den korrekten Rotationswert beim Ablesen des Beschleunigungsmessers oder ähnlicher Sensoren haben möchtest, verwende die Methode Display.getRotation() und tausche die Achsen entsprechend.

Die zugrunde liegende Aktivität und Ausrichtung

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

Plötzliche Änderungen der Ausrichtung und Größe sind auf einem Desktop verwirrend. Der Chromebook-Fenstermanager vermeidet dies auf ähnliche Weise wie der Nebeneinander-Modus von Android: Die Aktivität am unteren Ende des Stapels steuert die Attribute aller Aktivitäten darüber. Das kann zu Überraschungen führen. So kann eine gerade begonnene Aktivität, die im Hochformat nicht in der Größe veränderbar ist, im Querformat veränderbar sein.

Hier kommt es auf den jeweiligen Gerätemodus an: Im Tablet-Modus ist die Ausrichtung nicht gesperrt und jedes Fenster behält seine eigene Ausrichtung bei, ganz so wie es auf Android der Normalfall ist.

Richtlinien zur Ausrichtung

Beachten Sie die folgenden Richtlinien für die Ausrichtung:

  • Wenn deine App nur eine Ausrichtung unterstützt, füge die Informationen im Manifest hinzu, damit der Fenstermanager sie hat, bevor er die App startet. Wenn Sie die Ausrichtung angeben, sollten Sie nach Möglichkeit auch die Ausrichtung der Sensoren angeben. Chromebooks sind oft Convertibles und eine auf dem Kopf stehende App ist nicht nutzerfreundlich.
  • Versuchen Sie, nur eine Ausrichtung auszuwählen. Vermeiden Sie es, eine Ausrichtung im Manifest anzufordern und später programmatisch eine andere festzulegen.
  • Sei vorsichtig, wenn du die Ausrichtung auf Grundlage der Fenstergröße änderst. Der Nutzer kann in einem kleinen Fenster im Hochformat stecken bleiben und nicht mehr in ein größeres Fenster im Querformat zurückkehren.
  • In Chrome gibt es Fenstersteuerelemente, mit denen Sie zwischen allen verfügbaren Layouts wechseln können. Wähle die korrekte Ausrichtung aus, damit dem Nutzer beim Start der App das korrekte Layout angezeigt wird. Wenn eine App in Hoch- und Querformat verfügbar ist, wird sie – falls möglich – standardmäßig im Querformat angezeigt. Nachdem diese Option festgelegt wurde, wird sie für jede einzelne App gespeichert.
  • Versuche, unnötige Änderungen der Ausrichtung zu vermeiden. Wenn z. B. die Ausrichtung der Aktivität HOCHFORMAT ist, aber die App zur Laufzeit setRequestedOrientation(LANDSCAPE) aufruft, führt das zu einer unnötigen Größenänderung des Fensters. Das ist ärgerlich für den Nutzer und führt eventuell sogar zu einem Neustart, wenn die App nicht damit umgehen kann. Besser ist es, die Ausrichtung einmal festzulegen, z. B. im Manifest, und sie nur zu ändern, wenn es unbedingt nötig ist.

Weitere Hinweise

Hier sind einige weitere Punkte, die Sie bei der Verwendung von Android-Apps in ChromeOS beachten sollten:

  • Rufen Sie finish() nicht in der Methode onDestroy Ihrer Aktivität auf. Dadurch wird die App bei einer Größenänderung geschlossen und nicht neu gestartet.
  • Verwende keine Fenstertypen, die nicht kompatibel sind, wie z. B. TYPE_KEYGUARD und TYPE_APPLICATION_MEDIA.
  • Sorge für einen schnellen Neustart einer Aktivität, indem du Objekte, die zuvor zugewiesen wurden, im Cache speicherst.
  • Wenn Sie nicht möchten, dass der Nutzer die Größe Ihrer App ändert, geben Sie android:resizeableActivity=false in Ihrer Manifestdatei an.
  • Testen Sie Ihre App, um sicherzustellen, dass sie Änderungen der Fenstergröße angemessen verarbeitet.