アプリに透明なステータスバーを表示したいのですが(背景が背後に表示されるように)、下部のナビゲーションバーを黒のままにしておきたいです。
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>
などを使用しても機能しません。
ナビゲーションバーに影響を与えずに完全に透明なステータスバーを作成する方法を知っている人はいますか?
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>
_
スクリーンショットの例。
ロリポップ:
キットカット:
私はそれを理解しました: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);
}