显示/隐藏Android键盘后重新组合

vfhzx4xs  于 2023-06-20  发布在  Android
关注(0)|答案(1)|浏览(118)

我有一个写为@Composable的对话框。内部有一个可滚动的Column对象,带有2个TextField和Buttons(用于登录)。当用户输入错误信息时,顶部会出现错误文本。当TextFields具有焦点时,将显示android键盘。有了errorText,可能对话框太大了,以至于当键盘打开并开始滚动时(就像预期的那样)无法显示所有内容。但是当键盘关闭时,我希望对话框再次测量它的高度,以扩大高度并显示孔内容,而不需要滚动。因此,我假设如果键盘没有重新组合UI,则切换状态。
有没有办法在切换键盘时重新组合对话框?
下面是对话框的代码:

  1. @Composable
  2. fun Dialog() {
  3. val theme by currentTheme.collectAsMutableState()
  4. val error by rememberSaveable { mError }
  5. var emailError by rememberSaveable { mutableStateOf(context.getString(R.string.empty_error_text)) }
  6. var passwordError by rememberSaveable { mutableStateOf(context.getString(R.string.empty_error_text)) }
  7. var email = ""
  8. var password = ""
  9. Dialog(
  10. onDismissRequest = { onDismissRequest.invoke() },
  11. DialogProperties(dismissOnClickOutside = false)
  12. ) {
  13. Surface(
  14. modifier = Modifier
  15. .fillMaxWidth()
  16. .wrapContentHeight(),
  17. shape = RoundedCornerShape(size = 10.dp)
  18. ) {
  19. Column(modifier = Modifier.padding(16.dp)) {
  20. Row(
  21. modifier = Modifier.fillMaxWidth()
  22. ) {
  23. Image(
  24. modifier = verticalGradientModifier(theme).size(25.dp),
  25. painter = painterResource(id = R.mipmap.icons8_login_125px),
  26. contentDescription = stringResource(R.string.log_in_online)
  27. )
  28. Text(
  29. modifier = horizontalGradientModifier(theme)
  30. .align(CenterVertically)
  31. .padding(start = 5.dp),
  32. text = stringResource(R.string.log_in_online),
  33. fontSize = 16.sp,
  34. fontWeight = FontWeight.Bold
  35. )
  36. }
  37. Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
  38. if (error.isNotEmpty()) {
  39. Box(
  40. modifier = Modifier
  41. .fillMaxWidth()
  42. .padding(5.dp)
  43. .border(1.dp, Color.Red, RoundedCornerShape(10))
  44. ) {
  45. Text(
  46. modifier = Modifier.padding(5.dp),
  47. text = error,
  48. color = Color.Red
  49. )
  50. }
  51. }
  52. InputView(
  53. title = stringResource(R.string.email_label),
  54. description = stringResource(R.string.login_email_description),
  55. icon = R.mipmap.icons8_mail_125px,
  56. error = emailError,
  57. important = true
  58. ) {
  59. email = it
  60. emailError = if (it.isNotEmpty()) {
  61. ""
  62. } else {
  63. context.getString(R.string.empty_error_text)
  64. }
  65. }
  66. InputView(
  67. title = stringResource(R.string.label_password),
  68. description = stringResource(R.string.login_password_description),
  69. icon = R.mipmap.icons8_password_125px,
  70. error = passwordError,
  71. inputType = KeyboardType.Password,
  72. important = true
  73. ) {
  74. password = it
  75. passwordError = if (it.isNotEmpty()) {
  76. ""
  77. } else {
  78. context.getString(R.string.empty_error_text)
  79. }
  80. }
  81. Row(
  82. modifier = Modifier
  83. .align(CenterHorizontally)
  84. .padding(10.dp)
  85. ) {
  86. TextButton(
  87. modifier = Modifier
  88. .padding(5.dp)
  89. .border(
  90. width = 1.dp,
  91. brush = horizontalGradientBrush(theme),
  92. shape = RoundedCornerShape(percent = 10)
  93. ),
  94. enabled = passwordError.isEmpty() && emailError.isEmpty(),
  95. onClick = {
  96. Repository.execute {
  97. Repository.login(email, password) { success, _ ->
  98. if (success) {
  99. onDismissRequest.invoke()
  100. } else {
  101. //show error banner
  102. mError.value = "Ether email or password was wrong."
  103. }
  104. }
  105. }
  106. }) {
  107. Image(
  108. modifier = verticalGradientModifier(theme).size(25.dp),
  109. painter = painterResource(id = R.mipmap.icons8_login_125px),
  110. contentDescription = stringResource(R.string.title_login)
  111. )
  112. Text(
  113. modifier = horizontalGradientModifier(theme).padding(start = 5.dp),
  114. text = stringResource(R.string.title_login)
  115. )
  116. }
  117. Text(
  118. modifier = horizontalGradientModifier(theme)
  119. .padding(5.dp)
  120. .align(CenterVertically),
  121. text = "or"
  122. )
  123. TextButton(
  124. modifier = Modifier
  125. .padding(5.dp)
  126. .border(
  127. width = 1.dp,
  128. brush = horizontalGradientBrush(theme),
  129. shape = RoundedCornerShape(percent = 10)
  130. ),
  131. onClick = {
  132. //open Sign-In dialog
  133. }) {
  134. Image(
  135. modifier = verticalGradientModifier(theme).size(25.dp),
  136. painter = painterResource(id = R.mipmap.icons8_create_125px),
  137. contentDescription = stringResource(R.string.sign_in)
  138. )
  139. Text(
  140. modifier = horizontalGradientModifier(theme).padding(start = 5.dp),
  141. text = stringResource(R.string.sign_in)
  142. )
  143. }
  144. }
  145. }
  146. }
  147. }
  148. }
  149. }
bqucvtff

bqucvtff1#

您可以使用WindowInsets.isImeVisible侦听键盘状态并进行相应的更改。

示例代码

  1. @OptIn(ExperimentalLayoutApi::class)
  2. @Composable
  3. fun KeyboardListenerDemo() {
  4. Column(
  5. modifier = Modifier
  6. .fillMaxSize()
  7. .statusBarsPadding(),
  8. ) {
  9. Text(
  10. text = "Keyboard Visible : ${WindowInsets.isImeVisible}",
  11. modifier = Modifier
  12. .fillMaxWidth()
  13. .padding(16.dp),
  14. )
  15. OutlinedTextField(
  16. value = "",
  17. onValueChange = {},
  18. modifier = Modifier
  19. .fillMaxWidth()
  20. .padding(16.dp)
  21. )
  22. }
  23. }

**注意:**为了返回正确的值,您应该设置

  1. WindowCompat.setDecorFitsSystemWindows(window, false)

我已经在setContent{}之前的活动中设置了这个

来源:https://stackoverflow.com/a/73358604/9636037

请参考此答案以了解更高级的用例,如跟踪键盘打开和关闭。

展开查看全部

相关问题