W moim przypadku, gdy chciałem mieć coś takiego:
Musiałem postępować zgodnie z tym samym, co sugerował @Mdlc, ale prawdopodobnie nieco prostszy (kierowanie tylko > = 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)
Działa również w krajobrazie:
Edytuj
Powyższe rozwiązanie nie działa poprawnie w trybie wielu okien, gdzie użyteczny prostokąt nie jest mniejszy tylko ze względu na pasek nawigacji, ale także z powodu niestandardowego rozmiaru okna. Jedną z rzeczy, które zauważyłem, jest to, że w wielu oknach pasek nawigacji nie znajduje się nad aplikacją, więc nawet bez zmian w wypełnieniu DecorView mamy prawidłowe zachowanie:
Zwróć uwagę na różnicę między sposobem, w jaki pasek nawigacji znajduje się na dole aplikacji w tych scenariuszach. Na szczęście jest to łatwe do naprawienia. Możemy sprawdzić, czy aplikacja obsługuje wiele okien. Poniższy kod zawiera również część do obliczania i dostosowywania pozycji paska narzędzi (pełne rozwiązanie: 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
}
Wynik w trybie wyskakującym Samsunga: