我只能为状态栏设置FLAG_LAYOUT_NO_LIMITS吗?

BAr*_*ell 48 android android-5.0-lollipop android-statusbar

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

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

小智 25

这项工作对我来说

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
)
Run Code Online (Sandbox Code Playgroud)

styles.xml

<style name="TranslucentStatusBar" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowTranslucentStatus">true</item>
</style>
Run Code Online (Sandbox Code Playgroud)

V21\styles.xml

<style name="TranslucentStatusBar" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowDrawsSystemBarBackgrounds">false</item>
    <item name="android:windowTranslucentStatus">true</item>
</style>
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助!

  • 这不适用于 Samsung SM-T295(Android 10,One UI 2.1)。导航栏出现在内容的顶部。 (3认同)

mgc*_*ion 11

使用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)
}
Run Code Online (Sandbox Code Playgroud)


Scu*_*dam 10

getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
Run Code Online (Sandbox Code Playgroud)


Raj*_*ran 8

向下滚动以查看最终结果的外观

首先,定义您的styles.xml,如下所示:

styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
</style>
Run Code Online (Sandbox Code Playgroud)

不要添加以下行

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

当软键盘显示在带有对话框的对话框中时,在行上方添加不会增加布局。 EditText

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

v21 / styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
     <item name="android:windowDrawsSystemBarBackgrounds">false</item>
</style>
Run Code Online (Sandbox Code Playgroud)

v23 / styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
     <item name="android:windowDrawsSystemBarBackgrounds">false</item>
</style>
Run Code Online (Sandbox Code Playgroud)

活动代码-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)
    .
    .
.
}
Run Code Online (Sandbox Code Playgroud)

活动代码-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)
    .
    .
    .
}
Run Code Online (Sandbox Code Playgroud)

最终结果 最终结果

  • 几乎设备运行良好,但在运行 Android 10 和 One UI 2.0 的三星 Note 10+ 上不起作用导航栏仍然透明并与应用程序的内容重叠。 (4认同)

naw*_*aab 5

fun showTransparentStatusbar() {
        activity!!.window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN)
    }


    fun removeStatusbarFlags() {
        activity!!.window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
    }
Run Code Online (Sandbox Code Playgroud)


小智 3

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

WindowManager.LayoutParams attributes = getWindow().getAttributes();
    attributes.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
    getWindow().setAttributes(attributes);
Run Code Online (Sandbox Code Playgroud)

并再次显示导航栏使用此

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

    }
Run Code Online (Sandbox Code Playgroud)

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