У меня есть прозрачные панели состояния/навигации, и когда я помещаю элемент компоновки с макетом по умолчанию (сверху/слева), он помещается под строку состояния. В xml я использую fitsSystemWindows
, чтобы исправить это, как я могу получить такой же эффект в компоновке реактивного ранца?
Похоже, он должен делать именно то, что мне нужно. Но я не мог заставить его работать. Я вызываю WindowCompat.setDecorFitsSystemWindows(window, false)
и оборачиваю свой вид ProvideWindowInsets
, но вид все еще там - что я упускаю?
Или мне следует использовать один из модификаторов для всех представлений, которые мне нужно вставить?
Вы должны использовать модификатор, который соответствует вашим потребностям, например. Модификатор.systemBarsPadding
Это работает для меня, в действии у меня есть:
WindowCompat.setDecorFitsSystemWindows(window, false)
setContent {
JetpackComposePlaygroundTheme {
val controller = rememberAndroidSystemUiController()
CompositionLocalProvider(LocalSystemUiController provides controller) {
ProvideWindowInsets {
ComposeAppPlayground()
}
}
}
}
Затем на игровой площадке для создания приложений у меня есть что-то вроде этого:
Surface {
var topAppBarSize by remember { mutableStateOf(0) }
val contentPaddings = LocalWindowInsets.current.systemBars.toPaddingValues(
top = false,
additionalTop = with(LocalDensity.current) { topAppBarSize.toDp() }
)
Column(modifier = Modifier.navigationBarsPadding().padding(top = contentPaddings.calculateTopPadding())) {
// content can go here forexample...
// if you want the content go below status bar
// you can remove the top padding for column
}
InsetAwareTopAppBar(
title = { Text(stringResource(R.string.home)) },
backgroundColor = MaterialTheme.colors.surface.copy(alpha = 0.9f),
modifier = Modifier
.fillMaxWidth()
.onSizeChanged { topAppBarSize = it.height }
)
}
}
Также InsetAwareTopAppBar, который я нашел в руководствах, упомянутых в https://google.github.io/accompanist/insets/
@Composable
fun InsetAwareTopAppBar(
title: @Composable () -> Unit,
modifier: Modifier = Modifier,
navigationIcon: @Composable (() -> Unit)? = null,
actions: @Composable RowScope.() -> Unit = {},
backgroundColor: Color = MaterialTheme.colors.primarySurface,
contentColor: Color = contentColorFor(backgroundColor),
elevation: Dp = 4.dp
) {
Surface(
color = backgroundColor,
elevation = elevation,
modifier = modifier
) {
TopAppBar(
title = title,
navigationIcon = navigationIcon,
actions = actions,
backgroundColor = Color.Transparent,
contentColor = contentColor,
elevation = 0.dp,
modifier = Modifier
.statusBarsPadding()
.navigationBarsPadding(bottom = false)
)
}
}
Это должны быть статусбары, а не системные бары.
Взгляните на эту библиотеку chrisbanes.github.io/accompanist/insets