10

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 を実行している実際のデバイスで同じ結果が得られます。

サンプル画像

ナビゲーション バーが存在する場合、その実際のサイズを取得するにはどうすればよいですか?

4

2 に答える 2