15

ステータスバーが半透明ではなく完全に透明で、ナビゲーションバーがそのまま残される方法を検討しています。

私が得ることができる最も近いのは、フラグを使用することです

WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS

ただし、これはナビゲーション バーの背後にも描画されます。

これを難しくしているのは背景です。これは微妙なグラデーションです。ステータス バーの色をグラデーションの始点に設定すると、ほとんど正しいように見えますが、画面の上部に微妙な線が表示されます。

上部のみにアクティビティをウィンドウに合わせる良い方法はありますが、下部にナビゲーションバーがある場合はそのままにしておきますか?

4

2 に答える 2

27

良いアプローチは、この回答の方法 1です。

完全に透明なステータス バーを実現するに は、API 21 以降でのみ使用できるstatusBarColorを使用する必要があります。windowTranslucentStatusは API 19 以降で使用できますが、ステータス バーに色付きの背景が追加されます。ただし、 windowTranslucentStatusを設定すると、 statusBarColorを透明に変更しても実現できないことが 1 つあります。それは、SYSTEM_UI_FLAG_LAYOUT_STABLE および SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN フラグを設定することです。同じ効果を得る最も簡単な方法は、これらのフラグを手動で設定することです。これにより、Android レイアウト システムによって課されたインセットが効果的に無効になり、自分で対処する必要が生じます。

onCreate メソッドで次の行を呼び出します。

getWindow().getDecorView().setSystemUiVisibility(
    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

/res/values-v21/styles.xml で透明度も設定してください。

<item name="android:statusBarColor">@android:color/transparent</item>

または、透明度をプログラムで設定します。

getWindow().setStatusBarColor(Color.TRANSPARENT);

このアプローチの良い点は、透明なステータス バーを着色された半透明のステータス バーに交換することで、API 19 でも同じレイアウトとデザインを使用できることです。

<item name="android:windowTranslucentStatus">true</item>

これか似たようなことを試したことがあると思います。それでもうまくいかない場合は、ルート要素がFrameLayout.

于 2015-10-26T20:35:36.953 に答える
3

免責事項:APIレベル30の時点でシステム可視性フラグが非推奨になっているため、受け入れられた回答はAPIレベル30まで非推奨なしで有効であるため、これは補足的な回答です。

setDecorFitsSystemWindows()アプリにエッジ ツー エッジを実装します (つまり、アプリはコンテンツを拡張して画面全体に拡張し、システム ステータスとナビゲーション バーの両方をカバーします)。

これは、次のアクティビティで実装できます。

WindowCompat.setDecorFitsSystemWindows(window, false)

残りの部分は、システム ナビゲーション バーとの重複を避けることです。

ドキュメントに従って:

画面のどの部分がナビゲーション バーやステータス バーなどのシステム UI と交差するかを指定するインセットに対応することで、オーバーラップに対処できます。交差とは、単にコンテンツの上に表示されることを意味する場合もありますが、システム ジェスチャについてアプリに通知することもできます。

そのため、API レベル 30+ のインセットを処理して、アプリと下部のナビゲーション バーが重ならないようにする必要があります。

/*
*  Making the Navigation system bar not overlapping with the activity
*/
if (Build.VERSION.SDK_INT >= 30) {

    // Root ViewGroup of my activity
    val root = findViewById<ConstraintLayout>(R.id.root)

    ViewCompat.setOnApplyWindowInsetsListener(root) { view, windowInsets ->

        val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())

        // Apply the insets as a margin to the view. Here the system is setting
        // only the bottom, left, and right dimensions, but apply whichever insets are
        // appropriate to your layout. You can also update the view padding
        // if that's more appropriate.

        view.layoutParams =  (view.layoutParams as FrameLayout.LayoutParams).apply {
            leftMargin = insets.left
            bottomMargin = insets.bottom
            rightMargin = insets.right
        }

        // Return CONSUMED if you don't want want the window insets to keep being
        // passed down to descendant views.
        WindowInsetsCompat.CONSUMED
    }

}

詳細については、ドキュメントを確認してください。

余分なセント:

  • <item name="android:windowTranslucentStatus">true</item>下位の API レベルで使用する場合は、API-30 のテーマ/スタイルをオーバーライドする必要があります。つまりres\values-v30\themes.xml、デフォルトのスタイルの を使用します (もちろん は使用しませんwindowTranslucentStatus) 。
于 2021-10-24T18:27:47.813 に答える