Android 如何有一个透明的状态栏,但保持导航栏不透明?

Android 如何有一个透明的状态栏,但保持导航栏不透明?,android,styles,transparency,statusbar,navigationbar,Android,Styles,Transparency,Statusbar,Navigationbar,我想在我的应用程序上有一个透明的状态栏(所以背景在后面),但我希望底部的导航栏保持黑色 我可以通过设置getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)使两者透明 我可以通过设置true 但是,如果不使底部也透明,我无法使顶部完全透明。使用@android:color/transparent或类似工具无法工作

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

我可以通过设置
getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)使两者透明

我可以通过设置
true

但是,如果不使底部也透明,我无法使顶部完全透明。使用
@android:color/transparent
或类似工具无法工作


有人知道如何在不影响导航栏的情况下创建一个完全透明的状态栏吗?

要独立控制KitKat上状态栏和导航栏的透明度,只需在
onCreate()中使用窗口管理器标志
FLAG\u transparscent\u status
FLAG\u transparscent\u navigation
您的活动方法。但是,在KitKat上,系统可能会在状态栏上绘制一张半透明渐变纸条。这似乎是特定于设备的:在我的KitKat设备上它是完全透明的,但在Android Studio emulator上它显示了一个scrim

在Lolliop或更高版本上,您可以使用
Window#setStatusBarColor(int)
方法以及
FLAG\u DRAWS\u SYSTEM\u bar\u BACKGROUNDS
窗口管理器标志来设置状态栏颜色。请注意,在这种情况下,您可以清除
标志\u半透明\u状态
标志。如果您希望颜色是透明的,这意味着您的应用程序支持全屏模式并设置系统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);
}

我在kotlin转载了对我有用的正确答案:-

在活动中的
setContentView
之前粘贴下面给出的代码

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) {
        val flags = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
        window.addFlags(flags)
    }
在您的样式中,在主主题中粘贴以下两行:-

    <item name="android:windowDrawsSystemBarBackgrounds">false</item>
    <item name="android:navigationBarColor">@color/colorBlack</item>

希望我的回答能帮助别人

fun setTransparentStatusBar(activity: Activity) {
            activity?.let {
                it.window?.let {
                    it.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
                    it.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
                    it.statusBarColor = Color.TRANSPARENT
                    it.decorView.systemUiVisibility =
                        View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                }
            }
        }

非常感谢。我尝试了这段代码(我肯定运行的不仅仅是Android KitKat),但它没有创建一个透明的状态或导航,只有一个半透明的(因此状态/导航栏的覆盖比下面的背景更暗)。它的颜色设置似乎是alpha 0.5。看到这一点,我尝试在样式中将其颜色设置为alpha 0和transparent,但都没有修复它。我知道你说过,“在这种情况下,半透明实际上意味着完全透明:两者都没有颜色或alpha通道”,但我不能让它成为半透明之外的任何东西。你知道为什么吗?我在设置旗帜后也试过使用Window#setNavigationBarColor(TransparentColor),但它似乎对其半透明性没有任何影响(上面忘了提到)。你说得很对。在某些设备(或者可能是大多数设备!)上,它确实会在状态栏背景上显示一个半透明的纸条。恰好在我的KitKat设备(Asus Transformer TF701T)上,它是完全透明的。我已经更新了答案,使用全屏布局并控制系统UI可见性,在Lollipop+上显示一个完全透明的状态栏。我还没有找到一种可靠的方法让状态栏在KitKat上完全透明。最后!!一些有用的东西!谢谢OP和AGDownie。我在另一篇文章中回答了这个问题,它工作得很好(使状态栏透明,而导航栏保持稳定):相反,如何显示状态,但使导航栏透明?
fun setTransparentStatusBar(activity: Activity) {
            activity?.let {
                it.window?.let {
                    it.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
                    it.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
                    it.statusBarColor = Color.TRANSPARENT
                    it.decorView.systemUiVisibility =
                        View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                }
            }
        }