我有这个代码
setContent {
val items = mutableListOf<Int>().apply {
(1..100).forEach { add(it) }
}
LazyColumn {
items(items) { item ->
TextField("$item", {})
}
}
}
With android:windowSoftInputMode="adjustResize"
in my AndroidManifest.xml
.
如果我点击一个TextField
在列表顶部,我可以很好地输入文本。
如果我点击一个TextField
在屏幕底部附近,键盘会短暂出现,然后很快消失,并阻止我输入文本。
当出现以下情况时如何输入文字TextField
是在屏幕的底部吗?谢谢!
您的键盘在出现短暂、闪亮的时刻后就会消失。原因如下:
您点击TextField
,它调用它的内置焦点请求程序,并通过调用适当的(或不适当的,谁说的)内部方法向操作系统请求焦点,结果,键盘弹出(同样是内置机制。)只要字段可见,您就可以输入更多内容;或者用 Compose 术语来说,只要持有请求者的 Composable 就处于组合状态。
应该清楚的是,一旦拥有焦点请求者的可组合项离开屏幕,它就会被销毁(不是每次都会被销毁,只有某些特定情况才会被销毁......,但你的就是其中之一),当可组合项被销毁时,焦点请求者也被销毁。没有焦点请求者,没有焦点所有者——键盘消失了。
现在这非常重要,因为您正在使用LazyColumn
,一个懒惰的可组合项,因其对用户不再可见的可组合项的无情屠杀而臭名昭著。因此,只要关注的是顶部(或其他“可见”)文本字段,它就会保持并按预期工作。然而,底部的文本字段,as键盘弹出,超出了可见范围,以至于被屠杀(回收是技术术语,但这有什么意思?),剥夺了键盘的用途。
现在,这个懒惰的专栏就像任何罪犯一样,留下了线索,却没有注意到,这导致我们当场抓住了他。看到该专栏的实际运作确实非常有趣。
现在,解决方法包括使用列,而不是惰性列;使用自定义惰性可组合项创建您自己的惰性列,并手动处理可组合项的堆大小,以便最终字段不会失去组合。
就这样,你痊愈了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)