systemWindowInsetBottom と stableInsetBottom はどちらも常に 0 です
バックグラウンド テクスチャを持つアクティビティがあり、FLAG_LAYOUT_NO_LIMITS を使用して、その背景をステータス バーとナビゲーション バーの背後に移動させています。しかし、ビューの他のコンテンツがこれらのシステム UI コンポーネントの背後にあるのは望ましくありません。
最初resources.getIdentifier("navigation_bar_height", "dimen", "android")
はナビゲーションバーの高さを取得するために使用することを考えましたが、それはナビゲーションバーのデフォルトの高さであるため、ユーザーがナビゲーションバーを非表示にしているデバイスでは機能しません。(サムスンのデバイス)
次に、 WindowInsets と android:fitsSystemWindows="true" について知りました
ステータス バーでは機能しますが、ナビゲーション バーでは機能しません。
私の活動で
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//These 2 flags don't seem to change anything
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN)
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR)
//This flag is required so the background can go behind the navbar
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
rootView.setOnApplyWindowInsetsListener { _, insets ->
val topTextViewParams = rootView.tvTop.layoutParams as ViewGroup.MarginLayoutParams
topTextViewParams.topMargin = insets.systemWindowInsetTop
val bottomTextViewParams = rootView.tvBottom.layoutParams as ViewGroup.MarginLayoutParams
bottomTextViewParams.bottomMargin = insets.systemWindowInsetBottom //Inset is always 0
insets.consumeSystemWindowInsets()
}
}
そして私のレイアウト
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:id="@+id/rootView"
android:background="@color/colorPrimary"
tools:context=".MainActivity">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tvBottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:text="Text aligned to bottom of layout with no margin"/>
<TextView
android:id="@+id/tvTop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:text="Text aligned to top of layout with no margin"/>
</android.support.constraint.ConstraintLayout>
</android.support.design.widget.CoordinatorLayout>
API 28 を実行している Nexus 5x エミュレーターのスクリーンショットの例。API 26 を実行している実際のデバイスで同じ結果が得られます。
ナビゲーション バーが存在する場合、その実際のサイズを取得するにはどうすればよいですか?