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 Bildschirmen im Querformat oder auf aufgeklappten Faltgeräten mehr zu tun.
Wie kann man die App auf dem äußeren Display eines faltbaren Geräts auf das Hochformat beschränken, auf dem inneren Display aber das Querformat aktivieren?
Dieser Leitfaden ist eine vorübergehende Maßnahme, bis Sie Ihre App so verbessern können, dass sie alle Gerätekonfigurationen vollständig unterstützt.
Ergebnisse
Ihre App bleibt auf kleinen Bildschirmen unabhängig von der Geräteausrichtung im Hochformat. Auf großen Displays unterstützt die App sowohl das Quer- als auch das Hochformat.
Versionskompatibilität
Diese Implementierung ist mit allen API-Levels kompatibel.
Abhängigkeiten
Kotlin
implementation("androidx.window:window:1.5.1")
implementation("androidx.window:window-core:1.5.1")
Groovy
implementation "androidx.window:window:1.5.1"
implementation "androidx.window:window-core:1.5.1"
App-Ausrichtung verwalten
Wenn Sie die Querformat-Ausrichtung auf großen Displays aktivieren möchten, legen Sie in Ihrem App-Manifest fest, dass Ausrichtungsänderungen standardmäßig verarbeitet werden. Bestimmen Sie zur Laufzeit die Größe des App-Fensters. Wenn das App-Fenster klein ist, können Sie die Ausrichtung der App einschränken, indem Sie die Ausrichtungseinstellung im Manifest überschreiben.
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).
Außerdem können Sie nosensor verwenden, um die Ausrichtung zu bestimmen, ohne die Sensordaten zu berücksichtigen. Der folgende Code funktioniert jedoch auf dieselbe Weise.
Weitere Informationen finden Sie unter screenOrientation.
2. Bildschirmgröße ermitteln
Wenn das Manifest so konfiguriert ist, dass alle vom Nutzer erlaubten Ausrichtungen unterstützt werden, können Sie die App-Ausrichtung programmatisch basierend auf der Bildschirmgröße festlegen.
Fügen Sie die Jetpack WindowManager-Bibliotheken der Datei build.gradle oder build.gradle.kts des Moduls hinzu:
Kotlin
implementation("androidx.window:window:version") implementation("androidx.window:window-core:version")
Groovy
implementation 'androidx.window:window:version' implementation 'androidx.window:window-core:version'
Verwenden Sie die Jetpack WindowManager-Methode WindowMetricsCalculator#computeMaximumWindowMetrics(), um die Displaygröße des Geräts als WindowMetrics-Objekt abzurufen. Die Fenstermesswerte können mit Fenstergrößenklassen verglichen werden, um zu entscheiden, wann die Ausrichtung eingeschränkt werden soll.
Fenstergrößenklassen bieten die Breakpoints zwischen kleinen und großen Bildschirmen.
Verwenden Sie die Breakpoints WindowSizeClass#minWidthDp und WindowSizeClass#minHeightDp, um die Bildschirmgröße zu bestimmen:
/** Determines whether the device has a compact screen. **/
fun compactScreen() : Boolean {
val metrics = WindowMetricsCalculator.getOrCreate().computeMaximumWindowMetrics(this)
val width = metrics.bounds.width()
val height = metrics.bounds.height()
val density = resources.displayMetrics.density
val windowSizeClass =
BREAKPOINTS_V1.computeWindowSizeClass(width / density, height / density)
return windowSizeClass.minWidthDp == 0
}
- Hinweis:
- Die Beispiele werden als Methoden einer Aktivität implementiert. Daher wird die Aktivität im Argument von
computeMaximumWindowMetrics()alsthisdereferenziert. - Die Methode
computeMaximumWindowMetrics()wird anstelle voncomputeCurrentWindowMetrics()verwendet, da die App im Mehrfenstermodus gestartet werden kann. In diesem Modus wird die Einstellung für die Bildschirmausrichtung ignoriert. Es ist nicht sinnvoll, die Größe des App-Fensters zu bestimmen und die Ausrichtungseinstellung zu überschreiben, es sei denn, das App-Fenster entspricht dem gesamten Gerätebildschirm.
Eine Anleitung zum Deklarieren von Abhängigkeiten, damit die computeMaximumWindowMetrics()-Methode in Ihrer App verfügbar ist, finden Sie unter WindowManager.
3. Einstellung im App-Manifest überschreiben
Wenn Sie festgestellt haben, dass das Gerät eine kompakte Displaygröße hat, können Sie Activity#setRequestedOrientation() aufrufen, um die screenOrientation-Einstellung des Manifests zu überschreiben:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestedOrientation = if (compactScreen())
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT else
ActivityInfo.SCREEN_ORIENTATION_FULL_USER
...
// Replace with a known container that you can safely add a
// view to where the view won't affect the layout and the view
// won't be replaced.
val container: ViewGroup = binding.container
// Add a utility view to the container to hook into
// View.onConfigurationChanged. This is required for all
// activities, even those that don't handle configuration
// changes. You can't use Activity.onConfigurationChanged,
// since there are situations where that won't be called when
// the configuration changes. View.onConfigurationChanged is
// called in those scenarios.
container.addView(object : View(this) {
override fun onConfigurationChanged(newConfig: Configuration?) {
super.onConfigurationChanged(newConfig)
requestedOrientation = if (compactScreen())
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT else
ActivityInfo.SCREEN_ORIENTATION_FULL_USER
}
})
}
Wenn Sie die Logik den Methoden onCreate() und View.onConfigurationChanged() hinzufügen, können Sie die Messwerte für das maximale Fenster abrufen und die Ausrichtungseinstellung überschreiben, wenn die Größe der Aktivität geändert oder sie zwischen Displays verschoben wird, z. B. nach einer Drehung des Geräts 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.
Wenn Sie Jetpack Compose verwenden, können Sie dieselbe compactScreen()-Funktion in der Stamm-Composable Ihrer App verwenden, um dasselbe Ergebnis zu erzielen.
Wichtige Fakten
screenOrientation: App-Manifesteinstellung, mit der Sie festlegen können, wie Ihre App auf Änderungen der Geräteausrichtung reagiert- Jetpack WindowManager: Eine Reihe von Bibliotheken, mit denen Sie die Größe und das Seitenverhältnis des App-Fensters bestimmen können. Abwärtskompatibel bis API-Level 14.
Activity#setRequestedOrientation(): Methode, mit der Sie die Ausrichtung der App zur Laufzeit ändern können
Sammlungen, die diesen Leitfaden enthalten
Dieser Leitfaden ist Teil der folgenden kuratierten Sammlungen von Kurzanleitungen, die umfassendere Ziele der Android-Entwicklung abdecken: