In meinem Fall, in dem ich so etwas haben wollte:
Ich musste das Gleiche tun wie von @Mdlc vorgeschlagen, aber wahrscheinlich etwas einfacher ( nur Targeting > = 21):
//kotlin
val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
val realSize = Point()
windowManager.defaultDisplay.getRealSize(realSize);
val usableRect = Rect()
windowManager.defaultDisplay.getRectSize(usableRect)
Toast.makeText(this, "Usable Screen: " + usableRect + " real:"+realSize, Toast.LENGTH_LONG).show()
window.decorView.setPadding(usableRect.left, usableRect.top, realSize.x - usableRect.right, realSize.y - usableRect.bottom)
Es funktioniert auch in der Landschaft:
Bearbeiten
Die obige Lösung funktioniert im Mehrfenstermodus nicht ordnungsgemäß, wenn das verwendbare Rechteck nicht nur aufgrund der Navigationsleiste, sondern auch aufgrund der benutzerdefinierten Fenstergröße kleiner ist. Eine Sache, die mir aufgefallen ist, ist, dass in mehreren Fenstern die Navigationsleiste nicht über der App schwebt, sodass wir auch ohne Änderungen an der DecorView-Auffüllung das richtige Verhalten haben:
Beachten Sie den Unterschied, wie sich die Navigationsleiste in diesen Szenarien über dem unteren Rand der App befindet. Glücklicherweise ist dies leicht zu beheben. Wir können überprüfen, ob die App mehrere Fenster ist. Der folgende Code enthält auch den Teil zum Berechnen und Anpassen der Position der Symbolleiste (vollständige Lösung: https://stackoverflow.com/a/14213035/477790 )
// kotlin
// Let the window flow into where window decorations are
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN)
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
// calculate where the bottom of the page should end up, considering the navigation bar (back buttons, ...)
val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
val realSize = Point()
windowManager.defaultDisplay.getRealSize(realSize);
val usableRect = Rect()
windowManager.defaultDisplay.getRectSize(usableRect)
Toast.makeText(this, "Usable Screen: " + usableRect + " real:" + realSize, Toast.LENGTH_LONG).show()
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N || !isInMultiWindowMode) {
window.decorView.setPadding(usableRect.left, usableRect.top, realSize.x - usableRect.right, realSize.y - usableRect.bottom)
// move toolbar/appbar further down to where it should be and not to overlap with status bar
val layoutParams = ConstraintLayout.LayoutParams(appBarLayout.layoutParams as ConstraintLayout.LayoutParams)
layoutParams.topMargin = getSystemSize(Constants.statusBarHeightKey)
appBarLayout.layoutParams = layoutParams
}
Ergebnis im Samsung-Popup-Modus: