Аналог fitsSystemWindows в компоновке реактивного ранца

У меня есть прозрачные панели состояния/навигации, и когда я помещаю элемент компоновки с макетом по умолчанию (сверху/слева), он помещается под строку состояния. В xml я использую fitsSystemWindows, чтобы исправить это, как я могу получить такой же эффект в компоновке реактивного ранца?

Взгляните на эту библиотеку chrisbanes.github.io/accompanist/insets

jns 12.12.2020 01:21

Похоже, он должен делать именно то, что мне нужно. Но я не мог заставить его работать. Я вызываю WindowCompat.setDecorFitsSystemWindows(window, false) и оборачиваю свой вид ProvideWindowInsets, но вид все еще там - что я упускаю?

Phil Dukhov 12.12.2020 01:58

Или мне следует использовать один из модификаторов для всех представлений, которые мне нужно вставить?

Phil Dukhov 12.12.2020 02:00

Вы должны использовать модификатор, который соответствует вашим потребностям, например. Модификатор.systemBarsPadding

jns 12.12.2020 02:09
7
4
7 272
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это работает для меня, в действии у меня есть:

  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)
        )
    }
}


Это должны быть статусбары, а не системные бары.

ShadeToD 22.12.2021 11:47

Другие вопросы по теме