Android DialogFragment.dismise()将键盘留在屏幕上
我在我的应用程序中观察到一种奇怪的行为,在关闭Android DialogFragment.dismise()将键盘留在屏幕上,android,kotlin,keyboard,dismiss,dialogfragment,Android,Kotlin,Keyboard,Dismiss,Dialogfragment,我在我的应用程序中观察到一种奇怪的行为,在关闭对话框片段后,屏幕上的键盘在屏幕上徘徊,模糊了活动的UI,尽管活动在我的清单中将android:WindowsofInputMode设置为adjustResize 以下是我所拥有的: 该活动是一个AppCompatActivity 活动的根元素是CoordinatorLayout,它包含一个ScrollView,具有属性android:isScrollContainer=“true” 在我的清单文件中,此活动具有属性android:windowSo
对话框片段
后,屏幕上的键盘在屏幕上徘徊,模糊了活动的UI,尽管活动在我的清单中将android:WindowsofInputMode
设置为adjustResize
以下是我所拥有的:
- 该活动是一个
AppCompatActivity
- 活动的根元素是
,它包含一个CoordinatorLayout
,具有属性ScrollView
android:isScrollContainer=“true”
- 在我的清单文件中,此活动具有属性
android:windowSoftInputMode=“adjustResize”
- 该活动具有触发显示
的按钮,其中包含android.support.v4.app.DialogFragment
元素AutoCompleteTextView
- 当我的对话框及其
弹出时,键盘本身不会显示,因此我在对话框显示时显式显示键盘,并在关闭对话框之前隐藏键盘AutoCompleteTextView
disclose()
调用,并通过单击对话框之外的任何地方来关闭对话框时,我看到键盘正确地离开了,一切正常
DialogFragment类定义的相关代码如下:
class DualSelectionDialogFragment : DialogFragment() {
private var input: AutoCompleteTextView? = null
[...]
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
[...]
val builder = AlertDialog.Builder(context!!)
val content = activity?.layoutInflater?.inflate(R.layout.select_dual_mode, null)
[...]
input = content?.findViewById<AutoCompleteTextView>(R.id.dual_autocomplete_input)?.apply {
setAdapter(ArrayAdapter(context, android.R.layout.simple_list_item_1, [...]))
setOnItemClickListener { _, view, _, _ ->
[...]
hideKeyboard(context, this)
dismiss()
}
}
[...]
builder.setView(content).setCustomTitle(title)
return builder.create()
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
dialog.window.setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE +
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
}
[...]
fun hideKeyboard(context: Context, view: View) {
(context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager).hideSoftInputFromWindow(view.windowToken, 0)
}
}
class DualSelectionDialogFragment:DialogFragment(){
私有变量输入:AutoCompleteTextView?=null
[...]
重写FunonCreateDialog(savedInstanceState:Bundle?:对话框){
[...]
val builder=AlertDialog.builder(上下文!!)
val内容=活动?.LayoutFlater?充气(R.layout.select_dual_mode,null)
[...]
输入=内容?findViewById(R.id.dual\u自动完成\u输入)?。应用{
setAdapter(ArrayAdapter(context,android.R.layout.simple_list_item_1,[…]))
setOnItemClickListener{{,视图,{,}
[...]
隐藏板(上下文,此)
解雇
}
}
[...]
builder.setView(内容).setCustomTitle(标题)
returnbuilder.create()
}
覆盖活动创建的乐趣(savedInstanceState:Bundle?){
super.onActivityCreated(savedInstanceState)
dialog.window.setSoftInputMode(
WindowManager.LayoutParams.SOFT\输入\状态\可见+
WindowManager.LayoutParams.SOFT(输入调整大小)
}
[...]
趣味隐藏板(上下文:上下文,视图:视图){
(context.getSystemService(Activity.INPUT\u METHOD\u SERVICE)作为InputMethodManager)。hideSoftInputFromWindow(view.windowToken,0)
}
}
我在这里做错了什么吗?我在包含两个editText字段的DialogFragment中遇到了类似的问题。这是在调用
discouse()
之前调用的我的hideKeyboard
方法:
fun hideKeyboard(dialog: Dialog) {
val focusedEditTextView = dialog.currentFocus
val inputMethodManager = (focusedEditTextView?.context?.getSystemService(Context.INPUT_METHOD_SERVICE)) as InputMethodManager
if (inputMethodManager.isActive) {
inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS)
}
}
这对我来说很有效-在Android 9.1上进行了测试有趣的是,如果我延迟
disease()
调用,将该行替换为计时器(“dialogdisease”,false)。schedule(500){disease()}
,这个问题也会消失,这使它看起来非常像线程/并发问题。