问题: TextField (在惰性列中)文本位于keybaord下面
解释:
我有一个LazyColumn,其中包含一个显示文本字段的项目列表,在清单中,该活动具有windowSoftInputMode="adjustResize",而且在setContent之前,我还在onCreate方法中设置标志WindowCompat.setDecorFitsSystemWindows(window,false),并且我希望在任何时候都使文本出现在键盘上方,以获得更流畅的编辑体验!
使用伴奏库提供窗口插口,向盒子提供如下填充
Box(modifier = Modifier.weight(1f).navigationBarsWithImePadding()){
LazyColumn() {
items(myItems) { item->
ItemComposable(item)
}
}
}正如您所看到的,盒子上有navigationBarsWithImePadding,但是它不能工作,因为文本位于键盘下面,我尝试在LazyColumn上设置修饰符,但是它提供了相对于框外其他项的LazyColumn填充!
所以我尝试了contentPadding
LazyColumn(contentPadding=insets.ime.toPaddingValues(additionalBottom=insets.navigationBars.bottom.dp)) {
items(editor.blocks) { block ->
RenderBlock(block)
}
}同样没有工作,因为内容填充应用于最后一项/或之后,键盘位于文本上方。
用一个简单的列替换LazyColumn并使用一个LazyColumn修饰符会导致同样的问题,因为列表可以是长的垂直滚动。
发布于 2021-12-11 05:33:58
如果使用列,则可以参考以下代码片段:
Column(
modifier = Modifier
// other modifiers
.verticalScroll(scrollState, reverseScrolling = true)
.navigationBarsWithImePadding(),
verticalArrangement = Arrangement.Bottom,
)发布于 2021-12-17 09:57:58
最后,我为它准备了一个解决方案。只需遵循以下步骤:
步骤1:在您的AndroidManifest.xml中
<activity
...
android:windowSoftInputMode="adjustResize">
</activity>步骤2:在你的活动中
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
WindowCompat.setDecorFitsSystemWindows(window, false)
setContent {
AppTheme {
ProvideWindowInsets(
windowInsetsAnimationsEnabled = true,
consumeWindowInsets = false,
) {
// your content
}
}
}第3步:
LazyColumn(
modifier = Modifier
.navigationBarsWithImePadding()
.verticalScroll(state = rememberScrollState())
.height(LocalConfiguration.current.screenHeightDp.dp)
.fillMaxWidth(),
) {
// your TextField items
}第4步:
// init your CoroutineScope
val coroutineScope = rememberCoroutineScope()
// init your BringIntoViewRequester
val bringIntoViewRequester = BringIntoViewRequester()
// use them in your TextField modifier
modifier = Modifier
/* ... your other modifiers*/
.bringIntoViewRequester(bringIntoViewRequester)
.onFocusEvent {
if (it.isFocused || it.hasFocus) {
coroutineScope.launch {
delay(250)
bringIntoViewRequester.bringIntoView()
}
}
}
}希望能帮上忙。
https://stackoverflow.com/questions/67138999
复制相似问题