BAr*_*ell 2 android android-statusbar android-jetpack-compose
我有一个应用程序,其中除 2-3 个屏幕外的所有屏幕都具有相同的状态栏颜色。
因此,目的是在打开此屏幕时更改状态栏颜色,并在关闭此屏幕时将状态栏颜色重置为主题的默认颜色。
我正在尝试用以下方法来实现它DisposableEffect:
DisposableEffect(Unit) {
systemUiController.setStatusBarColor(color = anotherColor)
onDispose {
systemUiController.setStatusBarColor(color = defaultColor)
}
}
Run Code Online (Sandbox Code Playgroud)
它可以工作,但有延迟,不与 TopAppBar 同步:
正确实施的方法是什么?
我认为延迟是不可避免的,我从未见过它立即改变。
我总是选择透明状态栏+在系统栏后面绘制并自己处理所有事情。在系统栏后面绘图是新推荐的方法。由于您已经在使用 compose,因此在 accompanist lib + compose 1.2.0 的帮助下非常容易,内置了插入修饰符来帮助实现此目的。
要求您的活动从边到边布置(在系统栏后面绘制)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
WindowCompat.setDecorFitsSystemWindows(window, false)
}
Run Code Online (Sandbox Code Playgroud)
使用accompanist UIController lib,将状态栏颜色设置为透明。
systemUiController.setSystemBarsColor(
color = Color.Transparent,
darkIcons = useDarkIcons
)
Run Code Online (Sandbox Code Playgroud)
在您的可组合项中,根据需要使用适当的插图。
Modifier.fillMaxSize()
.statusBarsPadding() //status bar insets
.navigationBarsPadding() //nav bar insets
.systemBarsPadding() //both
Run Code Online (Sandbox Code Playgroud)
编辑:您可以创建一个一次性效果包装器来切换系统图标,并在您需要的任何地方使用它。例如:(你可以改进这个)
@Composable
fun initSystemUi(
useDarkIcons: Boolean = MaterialTheme.colors.isLight,
systemUiController: SystemUiController = rememberSystemUiController()
) {
DisposableEffect(Unit) {
systemUiController.setSystemBarsColor(
color = Color.Transparent,
darkIcons = useDarkIcons
)
onDispose {
systemUiController.setSystemBarsColor(
color = Color.Transparent,
darkIcons = useDarkIcons
)
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2129 次 |
| 最近记录: |