答案 0 :(得分:6)
我使用了在 Jetpack Compose 示例中找到的此代码。这对我来说可以。只需根据自己的喜好进行调整。
@Composable
fun SystemUi(windows: Window) =
MaterialTheme {
windows.statusBarColor = MaterialTheme.colors.surface.toArgb()
windows.navigationBarColor = MaterialTheme.colors.surface.toArgb()
@Suppress("DEPRECATION")
if (MaterialTheme.colors.surface.luminance() > 0.5f) {
windows.decorView.systemUiVisibility = windows.decorView.systemUiVisibility or
View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
}
@Suppress("DEPRECATION")
if (MaterialTheme.colors.surface.luminance() > 0.5f) {
windows.decorView.systemUiVisibility = windows.decorView.systemUiVisibility or
View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
}
}
答案 1 :(得分:6)
Google 刚刚创建了一个名为 accompanist
的库。
您可以在这里找到它:https://github.com/google/accompanist
它包含多个有用的 Jetpack Compose 库,其中包括一个系统 UI 控制器,您可以使用它来更改状态栏颜色。
文档 - https://google.github.io/accompanist/systemuicontroller/
答案 2 :(得分:3)
只需采用老式的方式并将其添加到 themes.xml 中:
<item name="android:windowTranslucentStatus">true</item>
答案 3 :(得分:2)
简单的答案是: 前往您的 MainActivity.kt,然后输入这些代码
WindowCompat.setDecorFitsSystemWindows(window, false)
这在之前
setContent{}
然后前往您的 values 文件夹,打开 colors.xml 并创建
<color name="transparent">#00000000</color>
转到主题,打开 themes.xml 和 themes.xml(night) 并将此代码放在两个文件中,放在其中一个带有颜色的样式标签中。
<item name="android:statusBarColor" tools:targetApi="l">@color/transparent</item>
这是在 Android 上创建透明状态栏的简单方法。
答案 4 :(得分:1)
我用这个:https://stackoverflow.com/a/22192691/9957384
它有效,但也许在 compose 中有更好的解决方案。 为方便起见,我建议创建一个 Ambient
答案 5 :(得分:0)
def version = "0.4.1"
implementation "dev.chrisbanes.accompanist:accompanist-coil:$version"
implementation "dev.chrisbanes.accompanist:accompanist-insets:$version"
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
WindowCompat.setDecorFitsSystemWindows(window, false)
setContent {
// A surface container using the 'background' color from the theme
val systemUiController = remember { SystemUiController(window) }
Providers(SysUiController provides systemUiController) {
ProvideWindowInsets {
val sysUiController = SysUiController.current
onCommit(sysUiController, LightColorPalette2.uiBackground) {
sysUiController.setSystemBarsColor(
color = LightColorPalette2.uiBackground.copy(alpha = AlphaNearOpaque)
)
}
Surface(color = MaterialTheme.colors.background) {
Greeting("Android")
}
}
}
}
}
}
你还需要这个文件:
package com.example.myjetsnack
导入android.os.Build 导入 android.view.View 导入 android.view.Window 导入 androidx.compose.runtime.staticAmbientOf 导入 androidx.compose.ui.graphics.Color 导入 androidx.compose.ui.graphics.compositeOver 导入 androidx.compose.ui.graphics.luminance 导入 androidx.compose.ui.graphics.toArgb
接口 SystemUiController { 有趣的 setStatusBarColor( 颜色:颜色, darkIcons: Boolean = color.luminance() > 0.5f, transformColorForLightContent: (Color) -> Color = BlackScrimmed )
fun setNavigationBarColor(
color: Color,
darkIcons: Boolean = color.luminance() > 0.5f,
transformColorForLightContent: (Color) -> Color = BlackScrimmed
)
fun setSystemBarsColor(
color: Color,
darkIcons: Boolean = color.luminance() > 0.5f,
transformColorForLightContent: (Color) -> Color = BlackScrimmed
)
}
有趣的 SystemUiController(window: Window): SystemUiController { 返回 SystemUiControllerImpl(window) }
/**
一个帮助类,用于优雅地设置 [Window] 的导航和状态栏颜色
基于 API 级别的降级行为。 */ 私有类 SystemUiControllerImpl(private val window: Window) : SystemUiController {
/**
设置状态栏颜色。
@param color 要设置的期望 [颜色]。如果在
上运行,这可能需要修改仅支持白色状态栏图标的 API 级别。
@param darkIcons 深色状态栏图标是否更可取。仅适用于
API 23+。
@param transformColorForLightContent 一个 lambda,如果
将被调用以转换 [color]已请求深色图标但不可用。默认应用黑色稀松布。 */ 覆盖乐趣 setStatusBarColor( 颜色:颜色, darkIcons:布尔值, transformColorForLightContent: (颜色) -> 颜色 ){ val statusBarColor = 当 { darkIcons && Build.VERSION.SDK_INT < 23 -> transformColorForLightContent(color) 其他 -> 颜色 } window.statusBarColor = statusBarColor.toArgb()
如果 (Build.VERSION.SDK_INT >= 23) { @Suppress("弃用") 如果(深色图标){ window.decorView.systemUiVisibility = window.decorView.systemUiVisibility 或 View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR } 别的 { window.decorView.systemUiVisibility = window.decorView.systemUiVisibility 和 View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() } } }
/**
设置导航栏颜色。
@param color 要设置的期望 [颜色]。如果在
上运行,这可能需要修改仅支持白色导航栏图标的 API 级别。此外,这将被忽略
和 [Color.Transparent] 将用于首选手势导航的 API 29+ 或
系统 UI 会在其他导航模式下自动应用背景保护。
@param darkIcons 深色导航栏图标是否更可取。仅适用于
API 26+。
@param transformColorForLightContent 一个 lambda,如果
将被调用以转换 [color]已请求深色图标但不可用。默认应用黑色稀松布。 */ 覆盖乐趣 setNavigationBarColor( 颜色:颜色, darkIcons:布尔值, transformColorForLightContent: (颜色) -> 颜色 ){ val navBarColor = 当 { Build.VERSION.SDK_INT >= 29 -> Color.Transparent // 用于手势导航 darkIcons && Build.VERSION.SDK_INT < 26 -> transformColorForLightContent(color) 其他 -> 颜色 } window.navigationBarColor = navBarColor.toArgb()
如果 (Build.VERSION.SDK_INT >= 26) { @Suppress("弃用") 如果(深色图标){ window.decorView.systemUiVisibility = window.decorView.systemUiVisibility 或 View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR } 别的 { window.decorView.systemUiVisibility = window.decorView.systemUiVisibility 和 View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR.inv() } } }
/**
/**
private val BlackScrim = Color(0f, 0f, 0f, 0.2f) // 20% 不透明黑色 私人 val BlackScrimmed:(颜色)-> 颜色 = { 原始 -> BlackScrim.compositeOver(原创) }
/**
一个虚假的实现,作为默认使用或在预览中使用。 */ 私有对象 FakeSystemUiController : SystemUiController { 覆盖乐趣 setStatusBarColor( 颜色:颜色, darkIcons:布尔值, transformColorForLightContent: (颜色) -> 颜色 ) = 单位
覆盖乐趣 setNavigationBarColor( 颜色:颜色, darkIcons:布尔值, transformColorForLightContent: (颜色) -> 颜色 ) = 单位
覆盖乐趣 setSystemBarsColor( 颜色:颜色, darkIcons:布尔值, transformColorForLightContent: (颜色) -> 颜色 ) = 单位 }