【问题标题】:set windowlightstatusbar property programmatically以编程方式设置 windowlightstatusbar 属性
【发布时间】:2017-08-05 00:18:52
【问题描述】:

如您所知,我们可以通过以下代码从 xml 设置 windowLightStatusBar

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

我需要通过编程方式将此属性 true 更改为 false 或 false 更改为 true。有办法实现吗?

【问题讨论】:

    标签: android android-statusbar


    【解决方案1】:

    如果您想更改图标颜色,请设置此项

    .setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_‌​BAR);
    

    并重置为默认设置

    .setSystemUiVisibility(0);
    

    但是如果你想改变 statusBar 的背景颜色使用这个

    getWindow.setStatusBarColor(ContextCompat.getColor(activity,R.color.my_statusbar_color));
    

    [API 26 更新]

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        window.insetsController?.setSystemBarsAppearance(WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,
                 WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS)
    } else {
        @Suppress("DEPRECATION")
        window.decorView.systemUiVisibility = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR or View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
        } else {
            View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
        }
        
    }
    

    并清除它

    window.insetsController?.setSystemBarsAppearance(0, APPEARANCE_LIGHT_STATUS_BARS)
    

    【讨论】:

    • 如果我需要将其设置为 false 怎么办?
    • 你说的假是什么意思?你想反转它然后不要设置它
    • 当我设置 "windowLightStatusBar" = true 时,状态栏的图标颜色变为灰色。但如果我将它设置为假,那么它会变成白色。就我而言,您的代码使用“.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_‌​BAR);”将其设置为 true。那么如何以编程方式将其设置为 false 呢?
    • .setSystemUiVisibility(0);测试一下
    • 如果我想为低于M 的版本做这件事
    【解决方案2】:

    我相信这是开启和关闭的正确方法。

    if (on) {
        View view = getWindow().getDecorView();
        view.setSystemUiVisibility(view.getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    } else {
        View view = getWindow().getDecorView();
        view.setSystemUiVisibility(view.getSystemUiVisibility() & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    }
    

    【讨论】:

    • 唯一的方法总是双向工作。但仅适用于 APIWindowInsetsController 执行相同操作的方法。
    【解决方案3】:

    要清除此属性,请使用以下代码:

    window.clearFlags( View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR)
    

    【讨论】:

      【解决方案4】:

      Hidro 的回答几乎是正确的,但 WindowInsetsControllerCompat 需要作为函数调用才能工作,否则它声称在我的情况下存在未解析的引用。

      对于 Kotlin:

      WindowInsetsControllerCompat(window, yourView).isAppearanceLightStatusBars = true
      

      对于 Java:

      WindowInsetsControllerCompat(getWindow(), yourView).setAppearanceLightStatusBars(true)
      

      【讨论】:

      • yourView 可以是WindowInsetsControllerCompat(window, window.decorView)
      • @AliZarei 你能解释一下它是如何不起作用的吗?即使使用非常旧版本的 androidx.core 库,它对我来说似乎也能正常工作。
      • @TongJingYen 状态栏图标在设置 isAppearanceLightStatusBars 为 false 后仍为黑色
      • 如果您在样式中设置android:windowLightStatusBar,这将不起作用。您需要调用已弃用的函数来禁用系统 UI 标志。
      【解决方案5】:
      getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
      getWindow().setStatusBarColor(Color.WHITE);
      

      【讨论】:

        【解决方案6】:

        由于 API 30 已弃用 View.setSystemUiVisibility() 以支持新的 WindowInsetsController API,因此该问题的 2021 年答案现在是 WindowInsetsControllerCompat#setAppearanceLightStatusBars(boolean),它向后兼容 API 23。需要 androidx.core:core:1.5.0-alpha05 或更高版本。

        WindowInsetsControllerCompat.setAppearanceLightStatusBars(true)
        
        

        【讨论】:

        • 无法解析 setAppearanceLightStatusBars
        • 这是一个实例方法,所以你需要先创建一个WindowInsetsControllerCompat的实例。
        • 我正在使用androidx.core:core-ktx:1.6.0 但无法填写此方法
        【解决方案7】:
        implementation "androidx.core:core-ktx:1.6.0"
        

        活动

        class MainActivity : AppCompatActivity() {
            override fun onCreate(savedInstanceState: Bundle?) {
                super.onCreate(savedInstanceState)
                setContentView(R.layout.activity_main)
        
                WindowInsetsControllerCompat(window, window.decorView).isAppearanceLightStatusBars = true
            }
        }
        

        在 Android 8 和 Android 12 上测试。运行良好

        【讨论】:

          【解决方案8】:

          只这样做
          它会使图标颜色变白

          getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
          

          【讨论】:

            猜你喜欢
            • 2012-08-20
            • 2021-06-22
            • 1970-01-01
            • 1970-01-01
            • 2023-01-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-20
            相关资源
            最近更新 更多