TextField 聚焦时隐藏在键盘下方
TextField is hiding under the keyboard when focused
我对隐藏在键盘下的 TextField 有疑问,我找到了类似问题的答案 here,但它们对我的情况没有帮助。我有一个 LazyColumn,其中包含不同可组合项的列表,当我在 window 中没有足够的元素来激活滚动时,聚焦 TextField 不会将聚焦的 TextField 提升到键盘上方。键盘只是隐藏它。
我的代码:
val listState = rememberLazyListState()
typealias ComposableType = @Composable (Int) -> Unit
val uiList = listOf<ComposableType>( {IconButton}, {Text}, {CustomTextField(listState,it)}, {CustomTextField(listState,it)})
LazyColumn() {
itemsIndexed(uiList) { index, ui ->
ui.invoke(index)
}
}
val scope = rememberCoroutineScope()
@Composable
CustomTextField(scrollState: LazyListState, position: Int) {
OutlinedTextField(
modifier = Modifier.onFocusEvent { focusState ->
if (focusState.isFocused) {
scope.launch {
scrollState.animateScrollToItem(position)
}
}
)
}
因此,例如,如果我的 uiList 中有 10 个 CustomTextField,则当聚焦其中一个 TextField 时,滚动会起作用。但是当 uiList 中只有 2 个 TextField 时,关注其中任何一个都不会将它们提升到键盘上方。
我还尝试使用 RelocationRequester() 并使用 Column with scroll 而不是 LazyColumn,none 有帮助。
这是多种因素的结合...
- 您需要在 activity 在 Android.xml
中的声明中添加此内容
android:windowSoftInputMode="adjustResize"
- 如您所述,在
TextField
中使用 BringIntoViewRequester
作为修饰符。
.bringIntoViewRequester(yourBringIntoViewRequester)
- 当组件以编程方式获得焦点(使用
FocusRequester
)时,上述步骤对我有用。但是,当用户点击 TextField 时,它对我不起作用。所以我实施了一个解决方法(我对此并不感到自豪):当 TextField
获得焦点时,我稍等片刻以使用 RelocationRequester
。所以我将这个修饰符添加到我的 TextField
.
.onFocusEvent {
if (it.isFocused) {
coroutineScope.launch {
delay(200)
yourBringIntoViewRequester.bringIntoView()
}
}
}
这三件事对我有用。
您需要将此添加到 activity 在 AndroidManifest.xml
中的声明中
android:windowSoftInputMode="adjustResize"
您必须将 wrapContentHeight().navigationBarsWithImePadding() 设置为父可组合项的修饰符
列(修饰符 = Modifier.wrapContentHeight().navigationBarsWithImePadding()){}
这个解决方案对我有用。
我对隐藏在键盘下的 TextField 有疑问,我找到了类似问题的答案 here,但它们对我的情况没有帮助。我有一个 LazyColumn,其中包含不同可组合项的列表,当我在 window 中没有足够的元素来激活滚动时,聚焦 TextField 不会将聚焦的 TextField 提升到键盘上方。键盘只是隐藏它。 我的代码:
val listState = rememberLazyListState()
typealias ComposableType = @Composable (Int) -> Unit
val uiList = listOf<ComposableType>( {IconButton}, {Text}, {CustomTextField(listState,it)}, {CustomTextField(listState,it)})
LazyColumn() {
itemsIndexed(uiList) { index, ui ->
ui.invoke(index)
}
}
val scope = rememberCoroutineScope()
@Composable
CustomTextField(scrollState: LazyListState, position: Int) {
OutlinedTextField(
modifier = Modifier.onFocusEvent { focusState ->
if (focusState.isFocused) {
scope.launch {
scrollState.animateScrollToItem(position)
}
}
)
}
因此,例如,如果我的 uiList 中有 10 个 CustomTextField,则当聚焦其中一个 TextField 时,滚动会起作用。但是当 uiList 中只有 2 个 TextField 时,关注其中任何一个都不会将它们提升到键盘上方。
我还尝试使用 RelocationRequester() 并使用 Column with scroll 而不是 LazyColumn,none 有帮助。
这是多种因素的结合...
- 您需要在 activity 在 Android.xml 中的声明中添加此内容
android:windowSoftInputMode="adjustResize"
- 如您所述,在
TextField
中使用BringIntoViewRequester
作为修饰符。
.bringIntoViewRequester(yourBringIntoViewRequester)
- 当组件以编程方式获得焦点(使用
FocusRequester
)时,上述步骤对我有用。但是,当用户点击 TextField 时,它对我不起作用。所以我实施了一个解决方法(我对此并不感到自豪):当TextField
获得焦点时,我稍等片刻以使用RelocationRequester
。所以我将这个修饰符添加到我的TextField
.
.onFocusEvent {
if (it.isFocused) {
coroutineScope.launch {
delay(200)
yourBringIntoViewRequester.bringIntoView()
}
}
}
这三件事对我有用。
您需要将此添加到 activity 在 AndroidManifest.xml
中的声明中android:windowSoftInputMode="adjustResize"
您必须将 wrapContentHeight().navigationBarsWithImePadding() 设置为父可组合项的修饰符
列(修饰符 = Modifier.wrapContentHeight().navigationBarsWithImePadding()){}
这个解决方案对我有用。