67

我需要制作透明的状态栏。我正在使用getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)它,它是我想要的状态栏。但它也影响导航栏:它变得透明并且getWindow().setNavigationBarColor(Color.BLACK)什么也不做。

有没有办法只制作透明状态栏而不是导航栏?

4

13 回答 13

37

这对我有用

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

样式.xml

<style name="TranslucentStatusBar" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowTranslucentStatus">true</item>
</style>

v21\styles.xml

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

状态栏将透明或半透明,导航栏不会

希望这可以帮助!

于 2018-08-30T08:58:51.890 回答
20

使用mikepenz 的评论

我在下面的确切工作代码(转换为 kotlin)。

// at AppCompatActivity, min SDK is 16, I tested api 25
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) {
        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
    }
    if (Build.VERSION.SDK_INT >= 19) {
        window.decorView.systemUiVisibility =
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    }
    if (Build.VERSION.SDK_INT >= 21) {
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        window.statusBarColor = Color.TRANSPARENT
    }

    setContentView(R.layout.activity_main)
}
于 2018-01-11T04:48:02.333 回答
15

向下滚动以检查最终结果的样子

首先,像这样定义你的styles.xml -

样式.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
</style>

不要添加以下行

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

当软键盘显示在带有EditText

然后像这样在 v21v23 样式中覆盖此样式-

v21/styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
     <item name="android:windowDrawsSystemBarBackgrounds">false</item>
</style>

v23/styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
     <item name="android:windowDrawsSystemBarBackgrounds">false</item>
</style>

活动代码 - Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    window.setFlags(
            LayoutParams.FLAG_LAYOUT_NO_LIMITS,
            LayoutParams.FLAG_LAYOUT_NO_LIMITS
    )
    setContentView(R.layout.YOUR_LAYOUT_RESOURCE_ID)
    .
    .
.
}

活动代码 - Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().setFlags(
            LayoutParams.FLAG_LAYOUT_NO_LIMITS,
            LayoutParams.FLAG_LAYOUT_NO_LIMITS
    )
    setContentView(R.layout.YOUR_LAYOUT_RESOURCE_ID)
    .
    .
    .
}

最终结果 最终结果

于 2019-03-03T18:58:27.663 回答
11
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
于 2016-11-28T09:06:36.107 回答
5
fun showTransparentStatusbar() {
        activity!!.window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN)
    }


    fun removeStatusbarFlags() {
        activity!!.window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
    }
于 2018-07-30T05:00:59.527 回答
4

试试这个,不会后悔的

window.decorView.systemUiVisibility = (
     View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
     View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
)
于 2020-08-26T20:06:14.623 回答
3

您可以像这样使用隐藏状态栏和导航栏

WindowManager.LayoutParams attributes = getWindow().getAttributes();
    attributes.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
    getWindow().setAttributes(attributes);

并再次显示导航栏使用这个

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

    }

颜色对我来说是灰色的,也许你可以将它强制为你的原色

于 2016-02-24T18:44:04.163 回答
3
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

上面的标志对我有用。导航按钮可见,状态栏和操作栏隐藏。

getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

不管用。测试设备连接 5。

于 2018-03-23T12:35:30.950 回答
1

我找到了解决方案兄弟

<style name="transparent" parent="Theme.AppCompat.Light.NoActionBar">//AppCompat is the key; You can choose any other theme than the light-theme, but stick to AppCompat
    <item name="android:windowTranslucentStatus">false</item>
    <item name="android:windowDrawsSystemBarBackgrounds">false</item>
    //Other styling(optional)
</style>

然后像这样将此透明主题应用于您的活动清单

 <activity
      ...
      android:theme="@style/transparent"/>
于 2017-07-24T08:03:04.567 回答
1

对于所有对变通办法/黑客感兴趣的人,因为涉及此问题的 Android API 实在是太糟糕了。不要使用任何系统窗口标志,将负边距设置为布局的根,然后用于setStatusBarColor使您的StatusBar透明。

statusBarHeight = getResources().getDimensionPixelSize(R.dimen.margin_24dp);
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId != 0) {
    statusBarHeight = getResources().getDimensionPixelSize(resourceId);
}

FrameLayout.LayoutParams rootParams = (FrameLayout.LayoutParams) binding.getRoot().getLayoutParams();
rootParams.topMargin = -statusBarHeight;
binding.getRoot().setLayoutParams(rootParams);

getWindow().setStatusBarColor(getResources().getColor(R.color.transparent));

binding.getRoot() 当然是布局的根

结果是

在此处输入图像描述

于 2020-07-03T14:35:15.170 回答
0
getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
)

<style name="TranslucentStatusBar" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowTranslucentStatus">true</item>
</style>
于 2019-04-08T05:58:40.977 回答
0

是的,您可以在 Style.xml 中使用此代码

<style name="transparent" parent="Theme.AppCompat.Light">//AppCompat is the key; You can choose any other theme than the light-theme, but stick to AppCompat

    <item name="colorPrimaryDark">#00000000</item>//THIS is the important part.
    //Other styling(optional)
</style>

然后将其应用于您的布局,只需在根布局(视图)中添加以下行:

android:theme="@style/transparent"
于 2017-06-15T06:40:48.007 回答
-1

这适用于三星 S10+ (Pie)、Oppo F7 和 Oppo F5S (Oreos):

getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_OVERSCAN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

正如原始海报所要求的,应用程序区域在顶部扩展并覆盖状态栏(时钟所在的位置)。但安卓导航(虚拟)按钮仍位于屏幕底部,而应用程序位于安卓按钮之上。

于 2019-10-17T13:15:32.560 回答