実現したいこと
Fragmentから入力可能なカスタムダイアログを表示、
カスタムダイアログの外側をタップでキーボードを非表示にしたいです。
前提
androidでkotlinで実装しています。
FragmentのTextViewをタップすると
カスタムダイアログが表示されます。
そのダイアログには1つだけEditTextがあります。
ボタンはOKとキャンセルがあり、こちらは問題なく動いています。
ダイアログの外側を押された際に、
何もせずただダイアログだけ閉じたいのですが、
EditTextのキーボードが立ち上がった状態で外側をタップすると
最初のFragmentに戻った(ダイアログが閉じた)時に
キーボードが立ち上がったままになってしまいます。
該当のソースコード
カスタムダイアログ
kotlin
1 override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { 2 3 val inflater = requireActivity().layoutInflater 4 dialogView = inflater.inflate(R.layout.dialog,null) 5 val builder = AlertDialog.Builder(requireContext(), R.style.NumberPickerDialog) 6 7 builder.setView(dialogView) 8 builder.setTitle(R.string.setting) 9 builder.setMessage(R.string.setting_text) 10 builder.setIcon(R.drawable.ic_base) 11 12 13 val dialogEdit = dialogView.findViewById<EditText>(R.id.dialog_edit) 14 if(initData == 0){ 15 dialogEdit.setText("") 16 }else{ 17 dialogEdit.setText(initData.toString()) 18 } 19 //OK or キャンセル時処理 20 builder.setPositiveButton(R.string.ok){ _, _ -> 21 hideKeyboard() 22 this.listener.onGoalDialogPositiveClick(this,setData(dialogEdit.text.toString())) 23 } 24 builder.setNegativeButton(R.string.cancel){ _, _ -> 25 hideKeyboard() 26 this.listener.onGoalDialogNegativeClick(this,initData) 27 } 28 29 return builder.create() 30 } 31 32 override fun onCancel(dialog: DialogInterface) { 33 super.onCancel(dialog) 34 hideKeyboard() 35 } 36 37 38 private fun hideKeyboard(){ 39 40 val inputMethodManager = requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 41 inputMethodManager.hideSoftInputFromWindow(dialog?.currentFocus?.windowToken, 42 InputMethodManager.HIDE_NOT_ALWAYS 43 ) 44 }
FragmentにはOKキャンセル以外の処理は特に何もしていません。
試したこと
・onCreateDialog()内にsetOnCancelListenerを記載し、hideKeyboardを実行
・Fragmentに戻った際のfousを調べたところ、カスタムダイアログのfocusではないことを確認
・hideKeybordの際にフォーカスがEditTextにあることを確認
回答1件
あなたの回答
tips
プレビュー