android - 以编程方式打开时,ScrollView 内的微调器正在关闭
问题描述
我有一些EditText
行的形式布局。最后一行是Spinner
. 我想Done
在最后点击按钮时打开抽屉菜单EditText
。但是行为很奇怪。每次我点击Done
它时,它都会在几分之一秒内打开抽屉菜单,然后菜单立即关闭。你知道任何解决方案。我认为这会ScrollView
引起一些问题。因为我在另一个布局中使用相同的功能,但ScrollView
它工作正常。
//hide keyboard and auto-open dropdown menu on last EditText in form
editText?.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE){
editText?.let { app.hideKeyboard(it) }
spinner?.performClick()
}
true
}
fun hideKeyboard(view: View){
val imm = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(view.windowToken, 0)
}
更新:
我CustomSpinner
从教程中使用过,然后我想听打开事件并隐藏键盘。它仍在关闭该下拉菜单。我真的不知道是什么原因造成的。尝试手动向下滚动到底部,仍然是同样的问题。
更新 - 解决方案
我必须为它的最底部的全滚动创建处理程序,ScrollView
而且我必须放入spinner.performClick()
处理程序,因为隐藏键盘正在改变屏幕高度并且ScrollView
将关闭选项菜单,直到键盘最终被隐藏。
这意味着延迟 fullscroll 和 performclick 不会关闭选项菜单。
代码:
editText?.setOnEditorActionListener { v, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE){
v?.apply {
clearFocus()
app.hideKeyboard(this)
post(delay = 200){scrollView?.fullScroll(View.FOCUS_DOWN)}
}
post(delay = 200) {spinner?.performClick()}
}
true
}
解决方案
在打开它之前尝试滚动到微调器。
editText?.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE){
editText?.let { app.hideKeyboard(it) }
spinner?.let {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
scrollView?.scrollToDescendant(it)
} else {
scrollView?.scrollTo(0, it.getBottom())
}
it.performClick()
}
}
true
}
推荐阅读
- python - 如何在 python 中转换特殊字符的编码?
- python - 在分配全局之前引用的局部变量不起作用
- python - 找到适合多个参数的函数
- php - 在 zend-expressive-hal 配置中将选项传递给 ClassMethodsHydrator
- .net - msix 和多个目标框架不起作用
- reactjs - 使用带有反应的 print-js
- excel - 从第二行复制一列数据,直到其中包含数据的最后一行,然后粘贴为另一个工作表 VBA 上一列中的最后一行
- c# - 如何标记通用委托以接受空值?
- javascript - 尽管我确实将 jQuery 添加到我的 HTML 文件中,但获得淡入淡出不是一个函数
- sql-server - 基础提供程序在打开时失败。连接超时已过期