如何使用 IME 正确处理 Android Jetpack Compose Insets

问题描述 投票:0回答:1

几天来我一直在尝试解决 Jetpack Compose 问题的插图,但我完全陷入困境。我真的很难理解我的实现出了什么问题,因为使用 XML 来实现这一切都非常简单。

我尝试遵循指南、一些教程并搜索其他问题,但我无法找到正确的解决方案,每个问题都有不同的问题,所以我显然错过了一些东西。

我目前已启用的功能:

  1. 在清单中添加了 adjustmentResize。
    <application
        android:name=".Application"
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="false"
        android:windowSoftInputMode="adjustResize"
        android:theme="@style/CustomTheme">
  1. 添加了 setDecorFitsSystemWindows
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    WindowCompat.setDecorFitsSystemWindows(window, false
    
    checkAppSettings() // Just checks some data store settings.
    
    setContent {
       val viewState = viewModel.viewState.collectAsStateWithLifecycle()
    
       MyTheme(darkTheme = viewState.value.uiMode.isDarkTheme()) {
            MainScreen()
       }
    }
}
  1. imePadding()
    systemBarsPadding()
    添加到我的主支架中。我还更改了底部栏的可见性,以解决底部栏被推到内容旁边的问题。

注意:我还尝试了不同的组合,但我已经数不清了,包括删除主脚手架并将其替换为具有重量(1f)的 navHost 和其下方的底部栏的列,但仍然没有骰子。

@Composable
fun MainScreen() {
    val navController = rememberNavController()

    Scaffold(
        modifier = Modifier
            .fillMaxSize()
            .imePadding()
            .systemBarsPadding(),
        bottomBar = {
            if (!WindowInsets.isImeVisible) BottomNavigationBar(navController)
        }
    ) { paddingValues ->
        NavigationHost(
            modifier = Modifier.padding(paddingValues),
            navController = navController
        )
    }
}

为了进一步扩展,我的结构从主屏幕开始如下:

    \- MainScaffold \
        \- MainNavHost \
            \- SelectedBottomNavItemNavHost \
                \- SelectBottomNavItemScaffold

并为

SelectBottomNavItemScaffold
添加更多细节,这就是几乎每个屏幕上的样子:

Scaffold(
    topBar = {
        // This uses Material TopAppBar internally
        CustomTopAppBar(
            topAppBarVariation = TopAppBarVariation.Title(title = stringResource(id = label)),
            showIcons = state.shouldDisplayEditFeedIcon(),
            actions = {
                Icon(
                    modifier = Modifier.clickable(
                        interactionSource = remember { MutableInteractionSource() },
                        indication = ripple(bounded = false),
                        onClick = { navController.navigateTo(FeedNavigationItem.FeedEdit) }
                    ),
                    painter = painterResource(R.drawable.ic_edit),
                    contentDescription = stringResource(id = R.string.edit)
                )
            }
        )
    }
) { paddingValues ->
    Column(
        modifier = Modifier
            .fillMaxSize()
            .padding(paddingValues)
    ) {
        // Page content goes here, now.
    }
}

具体问题:

实际问题可以在我下面分享的两个视频中看到:

不要隐藏底栏 在底部栏添加
WindowInsets.isImeVisible
检查
https://imgur.com/HkLysj7 https://imgur.com/SY3xhz6

在第一种方法中,我们不隐藏任何内容。底部栏随键盘滚动,看起来不错。但是,如果您将文本视图聚焦在屏幕底部,则向上滚动内容时会出现一些抖动。如果我选择屏幕顶部的文本视图,则不会出现问题。

在第二种方法中,我们隐藏底部栏,但这会导致出现空白(有时最初更大,然后抖动动画到更小的尺寸)。我不确定它是否与插入符号有关,因为出现了一个与空白匹配的正方形,但它在布局检查器中没有任何可用的名称或选择,如here所示。

现在,我不太确定如何提出这个问题,因为我真的很茫然。如果有人在尝试设置时遇到类似问题,我想在这里寻求任何见解或指导 🙇u200d♂️

非常感谢!

android android-jetpack-compose android-jetpack windowinsets
1个回答
0
投票

嗯,在阅读另一个问题的一些不相关的内容后,我偶然发现了对

android:windowSoftInputMode="adjustResize"
标签中使用的
<activity>
的引用,而不是
<application>
标签。

从应用程序标签移至活动标签解决了我的所有问题 😭

希望这可以帮助将来的人不要犯像我一样的新手错误!

© www.soinside.com 2019 - 2024. All rights reserved.