web-dev-qa-db-ja.com

透明なステータスバーを持ちながらナビゲーションバーを不透明のままにする方法は?

アプリに透明なステータスバーを表示したいのですが(背景が背後に表示されるように)、下部のナビゲーションバーを黒のままにしておきたいです。

getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);を設定することで、両方を透過的にすることができます

<item name="Android:windowTranslucentStatus">true</item>を設定することで、上部を半透明(部分的に透明)にすることができます。

ただし、下部も透明にしないと、上部を完全に透明にすることはできません。 <item name="Android:statusBarColor">@Android:color/transparent</item>などを使用しても機能しません。

ナビゲーションバーに影響を与えずに完全に透明なステータスバーを作成する方法を知っている人はいますか?

8
Elliptica

KitKatのステータスバーとナビゲーションバーの半透明性を個別に制御するには、アクティビティのonCreate()メソッドでウィンドウマネージャーフラグ_FLAG_TRANSLUSCENT_STATUS_と_FLAG_TRANSLUSCENT_NAVIGATION_を使用するだけです。ただし、キットカットでは、システムはステータスバー上に描画可能な半透明のグラデーションスクリムを描画する場合があります。これはデバイス固有のようです。私のKitKatデバイスでは完全に透過的ですが、Android Studioエミュレーターではスクリムが表示されます。

Lolliop以降では、代わりにWindow#setStatusBarColor(int)メソッドと_FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS_ウィンドウマネージャーフラグを使用してステータスバーの色を設定できます。この場合、_FLAG_TRANSLUSCENT_STATUS_フラグをclearすることに注意してください。色を透明にしたい場合は、アプリケーションがフルスクリーンモードをサポートし、システムUIの可視性を設定することを意味します。したがって、ステータスバーの背景色を管理するのはアプリ次第です。

すべてをまとめると、次のようになります。

_@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Window window = getWindow();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(0x00000000);  // transparent
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
        int flags = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
        window.addFlags(flags);
    }
    setContentView(R.layout.main);
    window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
}
_

使用したレイアウトの例:

_<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="#ff00ff00"
    Android:fitsSystemWindows="false"
    tools:context=".MainActivity">

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerInParent="true"
        Android:text="Hello World!"/>

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:fitsSystemWindows="true"
        Android:orientation="vertical">

        <Android.support.v7.widget.Toolbar
            Android:id="@+id/toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="?attr/actionBarSize"
            Android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay"/>

    </LinearLayout>

</RelativeLayout>
_

スクリーンショットの例。

ロリポップ:

Lollipop+

キットカット:

KitKat

14
AGDownie

私はそれを理解しました:D

private void setTransparentStatusBarOnly(Activity activity) {
    activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
    // this lines ensure only the status-bar to become transparent without affecting the nav-bar
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
0
Alaa AbuZarifa