App-Ausrichtung auf Smartphones eingeschränkt, aber nicht auf großen Displays

Symbol für 2-Sterne-Bewertung

Deine App funktioniert auf Smartphones im Hochformat gut, daher hast du sie auf das Hochformat beschränkt. Sie sehen jedoch eine Möglichkeit, auf großen Bildschirmen im Querformat mehr zu tun.

Wie kannst du beides haben: die App auf kleinen Bildschirmen auf das Hochformat beschränken, aber auf großen Bildschirmen das Querformat aktivieren?

Best Practices

Die besten Apps berücksichtigen die Einstellungen der Nutzer, z. B. die Bildschirmausrichtung.

In den Qualitätsrichtlinien für adaptive Apps wird empfohlen, dass Apps alle Gerätekonfigurationen unterstützen, einschließlich Hoch- und Querformat, Mehrfenstermodus sowie zu- und aufgeklappter Zustand von faltbaren Geräten. Apps sollten Layouts und Benutzeroberflächen für verschiedene Konfigurationen optimieren und den Status bei Konfigurationsänderungen speichern und wiederherstellen.

Dieses Rezept ist eine vorübergehende Maßnahme – eine Prise Unterstützung für große Bildschirme. Verwende das Rezept, bis du deine App so verbessern kannst, dass sie alle Gerätekonfigurationen vollständig unterstützt.

Zutaten

  • screenOrientation: Einstellung im App-Manifest, mit der Sie festlegen können, wie Ihre App auf Änderungen der Geräteausrichtung reagiert
  • Activity#setRequestedOrientation(): Methode, mit der Sie die App-Ausrichtung zur Laufzeit ändern können
  • LocalConfiguration: Ein zusammensetzbarer lokaler Anbieter, der das aktuelle Gerät Configuration verfügbar macht, sodass Sie die Bildschirmabmessungen in DP ablesen können.
  • LaunchedEffect: Compose-API für Nebenwirkungen, die einen Codeblock ausführt, wenn sich ein Schlüssel ändert (in diesem Fall, wenn sich die Konfiguration ändert).

Schritte

Aktivieren Sie im App-Manifest die Standardeinstellung, dass die App Änderungen der Ausrichtung verarbeiten kann. Verwenden Sie dann zur Laufzeit Jetpack Compose, um die Ausrichtung auf kompakten Bildschirmen (Smartphones) dynamisch auf das Hochformat zu beschränken, während auf großen Bildschirmen alle Ausrichtungen zulässig sind.

1. Ausrichtungseinstellung im App-Manifest angeben

Du kannst entweder das Element screenOrientation des App-Manifests nicht deklarieren (in diesem Fall wird die Ausrichtung standardmäßig auf unspecified festgelegt) oder die Bildschirmausrichtung auf fullUser festlegen. Wenn der Nutzer die sensorbasierte Drehung nicht gesperrt hat, unterstützt deine App alle Geräteausrichtungen.

<activity
    android:name=".MyActivity"
    android:screenOrientation="fullUser">

Der Unterschied zwischen der Verwendung von unspecified und fullUser ist subtil, aber wichtig. Wenn du keinen screenOrientation-Wert deklarierst, wählt das System die Ausrichtung aus. Die Richtlinie, die das System zum Definieren der Ausrichtung verwendet, kann von Gerät zu Gerät unterschiedlich sein. Wenn du dagegen fullUser angibst, entspricht das eher dem vom Nutzer für das Gerät definierten Verhalten: Wenn der Nutzer die sensorbasierte Drehung gesperrt hat, folgt die App der Nutzereinstellung. Andernfalls lässt das System eine der vier möglichen Bildschirmausrichtungen zu (Hochformat, Querformat, umgekehrtes Hochformat oder umgekehrtes Querformat). Siehe android:screenOrientation.

2. Ausrichtung in Compose dynamisch einschränken

In Jetpack Compose können Sie die aktuellen Bildschirmabmessungen in DP reaktiv aus LocalConfiguration.current lesen und mit einem LaunchedEffect die Ausrichtung der Aktivität aktualisieren, wenn sich die Konfiguration ändert.

Wenn die Breite oder Höhe des Bildschirms kleiner als 600dp ist (entspricht dem kompakten Haltepunkt für Smartphones), beschränke die Ausrichtung auf das Hochformat. Andernfalls sollte das System die App entsprechend der Einstellung des Nutzers (unspecified oder fullUser) drehen können.

Hier ist die vollständige, kompilierbare Implementierung:

val configuration = LocalConfiguration.current
val context = LocalActivity.current

LaunchedEffect(configuration) {
    val activity = context ?: return@LaunchedEffect
    // Determine if screen is compact (phone-sized) in either width or height
    val isCompact = configuration.screenWidthDp < 600 || configuration.screenHeightDp < 600
    activity.requestedOrientation = if (isCompact) {
        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
    } else {
        ActivityInfo.SCREEN_ORIENTATION_FULL_USER
    }
}

Wenn Sie die Logik in einem LaunchedEffect(configuration)-Block hinzufügen, können Sie die Ausrichtungseinstellung reaktiv überschreiben, wenn sich die App-Konfiguration ändert, z. B. wenn die Größe der Aktivität geändert wird, sie zwischen Displays verschoben wird oder wenn ein faltbares Gerät gefaltet oder entfaltet wird.

Weitere Informationen dazu, wann Konfigurationsänderungen auftreten und wann sie eine Neuerstellung der Aktivität verursachen, finden Sie unter Konfigurationsänderungen verarbeiten.

Ergebnisse

Ihre App sollte jetzt auf kleinen Bildschirmen unabhängig von der Gerätedrehung im Hochformat bleiben. Auf großen Bildschirmen sollte die App das Quer- und Hochformat unterstützen.

Zusätzliche Ressourcen

Informationen zum Aktualisieren Ihrer App, damit sie alle Gerätekonfigurationen jederzeit unterstützt, finden Sie hier: