android 撰写:如何使用边到边和windowSoftInputMode调整ime填充和脚手架填充

bxgwgixi  于 2023-08-01  发布在  Android
关注(0)|答案(2)|浏览(147)

androidx.compose.material3.Scaffold填充错误地添加了导航栏填充,即使在软键盘打开时添加了IME填充,导致导航栏填充量加倍(参见下面的屏幕截图,分隔符应该接触软键盘的顶部)。
我想把下面的事情结合起来:
1.应用程序为edge-to-edge

  1. windowSoftInputModeadjustResize
    1.将我的内容放在androidx.compose.material3.Scaffold
    下面是MainActivity的代码:
  1. class MainActivity : AppCompatActivity() {
  2. override fun onCreate(savedInstanceState: Bundle?) {
  3. super.onCreate(savedInstanceState)
  4. WindowCompat.setDecorFitsSystemWindows(window, false)
  5. setContent {
  6. MyComposeApplicationTheme {
  7. Scaffold(
  8. topBar = {
  9. TopAppBar(
  10. title = { Text(text = stringResource(id = R.string.app_name)) }
  11. )
  12. },
  13. ) { scaffoldPadding ->
  14. Box(
  15. modifier = Modifier
  16. .fillMaxSize()
  17. .padding(scaffoldPadding),
  18. contentAlignment = Alignment.BottomCenter
  19. ) {
  20. OutlinedTextField(
  21. value = "",
  22. onValueChange = {},
  23. modifier = Modifier
  24. .fillMaxWidth()
  25. .padding(horizontal = 16.dp)
  26. )
  27. Divider()
  28. }
  29. }
  30. }
  31. }
  32. }
  33. }

字符串
它看起来是这样的:

的数据
但是,如果我打开键盘,屏幕无法正确调整大小,尽管在AndroidManifest中为Activity设置了android:windowSoftInputMode="adjustResize"属性:


如果我使用Modifier.imePadding(),情况会有所改善,但现在除了IME的填充外,还有Scaffold的内部填充,即使在键盘打开时也会考虑导航栏的填充:


什么是正确的方法来保持脚手架底部填充没有它添加导航栏填充时,输入法填充?
编辑
我怀疑这是Scaffold的一个bug,所以我在跟踪器上创建了一个问题:https://issuetracker.google.com/issues/249727298

2skhul33

2skhul331#

目前没有干净的解决方案,但以下解决方案似乎工作正常:将WindowInsets(0, 0, 0, 0)传递到Scaffold,然后在内部应用.padding(scaffoldPadding).consumedWindowInsets(scaffoldPadding).systemBarsPadding(),或者也在内部应用imePadding()

  1. class MainActivity : AppCompatActivity() {
  2. override fun onCreate(savedInstanceState: Bundle?) {
  3. super.onCreate(savedInstanceState)
  4. WindowCompat.setDecorFitsSystemWindows(window, false)
  5. setContent {
  6. MyComposeApplicationTheme {
  7. Scaffold(
  8. modifier = Modifier.imePadding(),
  9. topBar = {
  10. TopAppBar(
  11. title = { Text(text = stringResource(id = R.string.app_name)) }
  12. )
  13. },
  14. bottomBar = {
  15. BottomAppBar() {
  16. IconButton(onClick = { }) {
  17. Icon(Icons.Default.Build, null)
  18. }
  19. }
  20. },
  21. contentWindowInsets = WindowInsets(0, 0, 0, 0)
  22. ) { scaffoldPadding ->
  23. Box(
  24. modifier = Modifier
  25. .fillMaxSize()
  26. .padding(scaffoldPadding)
  27. .consumedWindowInsets(scaffoldPadding)
  28. .systemBarsPadding(),
  29. contentAlignment = Alignment.BottomCenter
  30. ) {
  31. OutlinedTextField(
  32. value = "",
  33. onValueChange = {},
  34. modifier = Modifier
  35. .fillMaxWidth()
  36. .padding(horizontal = 16.dp)
  37. )
  38. Divider()
  39. }
  40. }
  41. }
  42. }
  43. }
  44. }

字符串

展开查看全部
bbuxkriu

bbuxkriu2#

每当键盘打开时,由于某些原因,scaffoldPadding中的值都是错误的。
我有一个TopBar,但没有BottomBar。ScaffoldPadding值应为:

  • 顶部:64
  • 底部:0
  • 开始:0
  • 结束时间:0

但是(只有在键盘打开后):

  • 顶部:64
  • 第48章:bug?)
  • 开始:0
  • 结束时间:0

就个人而言,要解决我的问题,有一个额外的底部填充在脚手架是不适用于给定的脚手架填充。

  1. Scaffold(
  2. snackbarHost = { ...},
  3. topBar = { ...},
  4. content = { scaffoldPadding ->
  5. Box(
  6. modifier = Modifier.padding(top = scaffoldPadding.calculateTopPadding())
  7. ) {
  8. ...
  9. }
  10. }
  11. )

字符串

展开查看全部

相关问题