如何拥有透明状态栏但保留导航栏不透明?

Ell*_*ica 6 transparency android styles statusbar navigationbar

我希望在我的应用程序上有一个透明状态栏(所以背景会在它后面)但我希望底部的导航栏保持黑色.

我可以通过设置使两者都透明 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>或类似不起作用.

有谁知道如何在不影响导航栏的情况下制作完全透明的状态栏?

AGD*_*nie 10

独立控制在奇巧的状态和导航栏的transluscency,你可以简单地使用窗口管理器的标志FLAG_TRANSLUSCENT_STATUS,并FLAG_TRANSLUSCENT_NAVIGATIONonCreate()您的活动的方法.但是,在KitKat上,系统可以在状态栏上绘制一个半透明的渐变稀松布.这似乎是特定于设备的:在我的KitKat设备上它是完全透明的,但在Android Studio模拟器上它显示了一个稀松布.

在Lolliop或更高版本中,您可以使用该Window#setStatusBarColor(int)方法和FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS窗口管理器标志来设置状态栏颜色.请注意,您清除FLAG_TRANSLUSCENT_STATUS标志在这种情况下.如果您希望颜色是透明的,这意味着您的应用程序支持全屏模式并设置系统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);
}
Run Code Online (Sandbox Code Playgroud)

使用的布局示例:

<?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>
Run Code Online (Sandbox Code Playgroud)

屏幕截图示例.

棒糖:

棒棒堂+

奇巧:

奇巧


Zai*_*ain 6

从 API 级别 30 开始,大多数窗口标志都已弃用,

使用WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITSWill 使 Activity 与导航栏重叠,也使其透明。

因此,要使其在 API 级别 30 上工作,您可以使用setDecorFitsSystemWindows()

if (Build.VERSION.SDK_INT in 21..29) { 
    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
    window.decorView.systemUiVisibility =
        SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or SYSTEM_UI_FLAG_LAYOUT_STABLE
    window.statusBarColor = Color.TRANSPARENT
}

if (Build.VERSION.SDK_INT >= 30) {
    // Setting status bar color as not working with XML attribute
    window.statusBarColor = Color.TRANSPARENT
    // Making status bar overlaps with the activity
    WindowCompat.setDecorFitsSystemWindows(window, false)
}
Run Code Online (Sandbox Code Playgroud)

并将以下内容保留在 styles.xml 中:

<item name="android:windowTranslucentStatus" tools:targetApi="kitkat">true</item>
Run Code Online (Sandbox Code Playgroud)

更新

如果您发现布局的底部被底部导航遮住了;请先更详细地检查此答案。