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

Symbol für Bewertung mit zwei Sternen

Ihre App funktioniert auf Smartphones im Hochformat einwandfrei. Daher haben Sie die App auf das Hochformat beschränkt. Sie sehen jedoch die Möglichkeit, auf großen Displays im Querformat mehr zu tun.

Wie kann man die App auf kleinen Bildschirmen auf das Hochformat beschränken, auf großen Bildschirmen aber das Querformat aktivieren?

Best Practices

Die besten Apps berücksichtigen Nutzereinstellungen wie die Geräteausrichtung.

Die Richtlinien zur Qualität adaptiver Apps empfehlen, dass Apps alle Gerätekonfigurationen unterstützen, einschließlich Hoch- und Querformat, Multi-Window-Modus sowie zusammengeklappter 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 Displays. Verwenden Sie das Rezept, bis Sie Ihre App so verbessern können, dass alle Gerätekonfigurationen vollständig unterstützt werden.

Zutaten

  • screenOrientation: App-Manifesteinstellung, mit der Sie angeben können, wie Ihre App auf Änderungen der Geräteausrichtung reagiert
  • Activity#setRequestedOrientation(): Methode, mit der Sie die Ausrichtung der App zur Laufzeit ändern können
  • LocalConfiguration: Zusammensetzbarer lokaler Anbieter, der das aktuelle Gerät Configuration verfügbar macht, sodass Sie die Bildschirmabmessungen in DPs lesen können.
  • LaunchedEffect: Compose-API für Nebeneffekte, mit der ein Codeblock ausgeführt wird, wenn sich ein Schlüssel ändert (in diesem Fall, wenn sich die Konfiguration ändert).

Schritte

Aktivieren Sie im App-Manifest, dass die App standardmäßig Ausrichtungsänderungen verarbeitet. 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

Sie können entweder das Element screenOrientation im App-Manifest 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 Ihre App alle Geräteausrichtungen.

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

Der Unterschied zwischen unspecified und fullUser ist gering, aber wichtig. Wenn Sie keinen screenOrientation-Wert deklarieren, wählt das System die Ausrichtung aus. Die Richtlinie, die das System zur Definition der Ausrichtung verwendet, kann sich von Gerät zu Gerät unterscheiden. Wenn Sie hingegen fullUser angeben, entspricht das eher dem Verhalten, das der Nutzer für das Gerät definiert hat: Wenn der Nutzer die sensorbasierte Drehung gesperrt hat, folgt die App der Nutzereinstellung. Andernfalls erlaubt das System alle vier möglichen Bildschirmausrichtungen (Hochformat, Querformat, umgekehrtes Hochformat oder umgekehrtes Querformat). Weitere Informationen finden Sie unter android:screenOrientation.

2. Ausrichtung in Compose dynamisch einschränken

In Jetpack Compose können Sie die aktuellen Bildschirmabmessungen in DPs reaktiv über LocalConfiguration.current lesen und mit einem LaunchedEffect die Ausrichtung der Aktivität bei jeder Konfigurationsänderung aktualisieren.

Wenn die Bildschirmbreite oder -höhe kleiner als 600dp ist (entsprechend dem kompakten Breakpoint für Smartphones), beschränken Sie die Ausrichtung auf das Hochformat. Andernfalls sollte das System die App entsprechend der Einstellung des Nutzers (unspecified oder fullUser) drehen.

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 dazu führen, dass Aktivitäten neu erstellt werden, finden Sie unter Konfigurationsänderungen verarbeiten.

Ergebnisse

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

Zusätzliche Ressourcen

Weitere Informationen zum Aktualisieren Ihrer App, damit sie alle Gerätekonfigurationen unterstützt, finden Sie in den folgenden Artikeln: