【问题标题】:How do I set my status bar transparent but keep by navigation bar black?如何将状态栏设置为透明但导航栏保持黑色?
【发布时间】:2019-05-01 14:19:52
【问题描述】:

正如我的问题所暗示的,我正在尝试弄清楚如何将状态栏颜色设置为透明,同时保持导航栏黑色/自然色(不影响屏幕高度) 我提到了这个网站: Android Completely transparent Status Bar? 部分有效的解决方案之一是:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

但这会将我的屏幕内容推到导航栏下方,使其透明。我希望屏幕尺寸保持不变,同时保持导航栏的自然颜色。只是想让状态栏透明,但似乎所有其他方式都使它成为灰白色,即使我使用(setstatusbarcolor 选项)将其设置为透明。

关于如何去做的任何想法?我的最低 SDK 版本是 23

第二个视图是在上面添加代码后的视图,状态栏工作但屏幕在下方滑动,使导航栏也透明(即使设置fitsSystemWindows = false 也无济于事)。

提前致谢!

【问题讨论】:

  • 我还不太确定这个问题。如果你能添加一些你现在拥有的东西和你想要什么的图片,那就太好了。
  • 您能否检查我的回答,如果这是您的问题,请告诉我?
  • 运气不好 :(,让我附上截图
  • @ReazMurshed 在上面添加了截图,希望说明清楚
  • 截图很完美。感谢您附上它们。 :)

标签: java android android-layout android-statusbar android-navigation-bar


【解决方案1】:

尝试做下面提到的事情可能会对您的示例有所帮助。如果您仍然面临问题,请告诉我。如果它可以解决您的问题,请提供答案。

AndroidManifest.xml

<activity
   ....            
   android:theme="@style/TranslucentStatusBarTheme">
</activity>

values-v23\styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="TranslucentStatusBarTheme" parent="AppTheme">
        <item name="android:statusBarColor">@android:color/transparent</item>
        <item name="android:windowLightStatusBar">true</item>
    </style>
</resources>

Activity.java

private static void setWindowFlag(Activity activity, boolean on) {
    Window win = activity.getWindow();
    WindowManager.LayoutParams winParams = win.getAttributes();
    if (on) {
        winParams.flags |= WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
    } else {
        winParams.flags &= ~WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
    }
    win.setAttributes(winParams);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    // Check if the version of Android is Marshmallow or higher
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        int newUiOptions = getWindow().getDecorView().getSystemUiVisibility();
        newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;

        getWindow().getDecorView().setSystemUiVisibility(newUiOptions
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    }
    // Check if the version of Android is Lollipop or higher
    else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        setWindowFlag(this, false);
        getWindow().setStatusBarColor(ContextCompat.getColor(this, R.color.colorTranslucent));
    }

    super.onCreate(savedInstanceState);
}

【讨论】:

    【解决方案2】:

    您需要在活动主题中添加以下样式。

    styles.xml 中找到您的活动主题并添加以下内容。由于您的最低 SDK 版本为 23,因此您无需担心之前的 Android 版本。

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

    这是我得到的截图。

    这是我的主题风格。

    <style name="NoActionBar" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowActionBar">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowDrawsSystemBarBackgrounds">false</item>
        <item name="android:windowTranslucentStatus">true</item>
    </style>
    

    希望能解决您的问题。

    【讨论】:

    • 它会在整个应用程序中应用吗?我希望将其应用于一项活动。其余的活动都很好。让我知道这是否会影响其他任何事情
    • 不。这只会影响一项活动。如果您将相同的主题附加到其他活动中,那么它将影响其他活动。但是,您可以考虑为具有这种行为的此活动创建一个单独的主题。
    • 我的应用程序的最小 sdk 版本是 23 。我还需要分离出 values-v21 吗?另外,我在我的样式中添加了上述代码,并在我的活动中将其作为 style="@style/SignupActivity" 引用。没有运气。
    • 哦......如果你有 SDK 23,然后在你的普通 styles.xml 文件中添加 values-21 的代码,是的,当然,你不需要另一个文件夹 @987654328 @。我想我在这里有一个类似的设置,它在我的情况下工作。
    • 奇怪。不知道为什么它会给我带来问题。布局与您在另一个问题中发布的布局相同。我想知道某处是否缺少链接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 2018-10-13
    相关资源
    最近更新 更多