以编程方式设置 windowlightstatusbar 属性
set windowlightstatusbar property programmatically
如您所知,我们可以通过以下代码从 xml 设置 windowLightStatusBar
。
<item name="android:windowLightStatusBar">true</item>
我需要以编程方式将此属性从 true 更改为 false 或将 false 更改为 true。有办法实现吗?
如果要更改图标颜色,请设置此项
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
并重置为默认设置
.setSystemUiVisibility(0);
但是如果你想改变状态栏的背景颜色使用这个
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)
要清除此属性,请使用此代码:
window.clearFlags( View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR)
我相信这是打开和关闭的正确方法。
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);
}
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
getWindow().setStatusBarColor(Color.WHITE);
只做这个
它使图标颜色变白
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
由于 View.setSystemUiVisibility()
已从 API 30 中弃用,取而代之的是新的 WindowInsetsController
API,因此 2021 年的答案现在是 WindowInsetsControllerCompat#setAppearanceLightStatusBars(boolean)
, which is backward compatible to API 23. Required androidx.core:core:1.5.0-alpha05
或稍后。
WindowInsetsControllerCompat.setAppearanceLightStatusBars(true)
Hidro 的回答几乎是正确的,但 WindowInsetsControllerCompat 需要作为函数调用才能工作,否则它声称在我的情况下存在未解决的引用。
对于 Kotlin:
WindowInsetsControllerCompat(window, yourView).isAppearanceLightStatusBars = true
对于Java:
WindowInsetsControllerCompat(getWindow(), yourView).setAppearanceLightStatusBars(true)
implementation "androidx.core:core-ktx:1.6.0"
Activity
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 上测试。运行良好
如您所知,我们可以通过以下代码从 xml 设置 windowLightStatusBar
。
<item name="android:windowLightStatusBar">true</item>
我需要以编程方式将此属性从 true 更改为 false 或将 false 更改为 true。有办法实现吗?
如果要更改图标颜色,请设置此项
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
并重置为默认设置
.setSystemUiVisibility(0);
但是如果你想改变状态栏的背景颜色使用这个
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)
要清除此属性,请使用此代码:
window.clearFlags( View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR)
我相信这是打开和关闭的正确方法。
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);
}
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
getWindow().setStatusBarColor(Color.WHITE);
只做这个
它使图标颜色变白
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
由于 View.setSystemUiVisibility()
已从 API 30 中弃用,取而代之的是新的 WindowInsetsController
API,因此 2021 年的答案现在是 WindowInsetsControllerCompat#setAppearanceLightStatusBars(boolean)
, which is backward compatible to API 23. Required androidx.core:core:1.5.0-alpha05
或稍后。
WindowInsetsControllerCompat.setAppearanceLightStatusBars(true)
Hidro 的回答几乎是正确的,但 WindowInsetsControllerCompat 需要作为函数调用才能工作,否则它声称在我的情况下存在未解决的引用。
对于 Kotlin:
WindowInsetsControllerCompat(window, yourView).isAppearanceLightStatusBars = true
对于Java:
WindowInsetsControllerCompat(getWindow(), yourView).setAppearanceLightStatusBars(true)
implementation "androidx.core:core-ktx:1.6.0"
Activity
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 上测试。运行良好