【问题标题】:What is the proper way to get status bar height in compose?在撰写中获取状态栏高度的正确方法是什么?
【发布时间】:2022-09-30 08:41:34
【问题描述】:

通常在使用伴奏Modifier.statusBarsHeight() 时,高度会根据状态栏的可见性而改变,如果它是可见的24.dp或更多,如果它不可见,高度将为0.dp.但我希望无论其可见性如何,高度都不会变为零。

我已经使用了一段时间:

// TODO: use better solution to get a fixed status bar height
val statusBarHeight = with (LocalDensity.current) { LocalWindowInsets.current.statusBars.top.toDp() }
val fixedStatusBarHeight = remember { statusBarHeight }
  • 您当前的代码有什么问题?为什么在这里需要remember?如果状态栏发生更改,它将阻止您获得更新的值
  • @PylypDukhov 如果我在隐藏系统栏时不使用fixedStatusBarHeight,我的可组合填充将会改变,因为状态栏高度将为 0.dp
  • 当状态栏不可见时,为什么要它的高度?

标签: android android-jetpack-compose


【解决方案1】:

所以我最终做了一个变通方法和一个修饰符扩展,以便于使用。

首先,创建一个数据类来保存固定的插入值。

data class FixedInsets(
    val statusBarHeight: Dp = 0.dp,
    val navigationBarsPadding: PaddingValues = PaddingValues(),
)

其次,创建扩展和组合本地提供程序。

val LocalFixedInsets = compositionLocalOf<FixedInsets> { error("no FixedInsets provided!") }

@Composable
fun Modifier.fixedStatusBarsPadding(): Modifier {
    return this.padding(top = LocalFixedInsets.current.statusBarHeight)
}

@Composable
fun Modifier.fixedNavigationBarsPadding(): Modifier {
    return this.padding(paddingValues = LocalFixedInsets.current.navigationBarsPadding)
}

最后,在可组合函数的根部提供固定的插入值。

val systemBarsPadding = WindowInsets.systemBars.asPaddingValues()
val fixedInsets = remember {
    FixedInsets(
        statusBarHeight = systemBarsPadding.calculateTopPadding(),
        navigationBarsPadding = PaddingValues(
            bottom = systemBarsPadding.calculateBottomPadding(),
            start = systemBarsPadding.calculateStartPadding(LayoutDirection.Ltr),
            end = systemBarsPadding.calculateEndPadding(LayoutDirection.Ltr),
        ),
    )
}

CompositionLocalProvider(
    values = arrayOf(
        LocalFixedInsets provides fixedInsets,
    ),
) {
    MainScreen()
}

导航栏填充示例:

Text(
    text = "Hello i'm a text with navigation bar padding",
    modifier = Modifier
        .fillMaxSize()
        .background(color = Color.Red)
        .fixedNavigationBarsPadding(),
)

或者您可以使用calculateXPadding() 直接从本地组合访问Dp 中的大小:

val fixedInsets = LocalFixedInsets.current

Text(
    text = "The navigation bar's height is: ${fixedInsets.navigationBarsPadding.calculateBottomPadding()}",
)

【讨论】:

【解决方案2】:

问题越来越复杂你应该像这样使用它

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContent {
        Box(
            modifier = Modifier
                .fillMaxSize()
                .statusBarsPadding().navigationBarsPadding()
        ) {

        }

        Box(
            modifier = Modifier
                .fillMaxSize()
                .statusBarsPadding().systemBarsPadding()
        ) {

        }
    }
}

}

【讨论】:

  • 非常适合我!正确答案!
猜你喜欢
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多