質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

277閲覧

カスタムダイアログでダイアログの外側をタップでキーボードを非表示にしたい

watashichanchan

総合スコア8

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2023/05/18 05:24

実現したいこと

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にあることを確認

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2023/05/18 08:07

再現に必要なダイアログフラグメントの他の部分や表示側のアクティビティのコード・レイアウト、現象の発生したandroid のバージョン等を(必要なら最小限にして)ご提示ください。
watashichanchan

2023/05/19 03:03

コメントいただきありがとうございます。正しいかどうかは不明ですが、とりあえず自己解決欄?に記載した方法でキーボードが非表示になりました!
guest

回答1

0

自己解決

一応こちらで自己解決しました。

kotlin

1override fun onStart() { 2 super.onStart() 3 4 dialog?.window?.decorView?.setOnTouchListener { _, event -> 5 if (event.action == MotionEvent.ACTION_DOWN) { 6 hideKeyboard() 7 view?.performClick() 8 } 9 false 10 } 11 }

投稿2023/05/19 03:01

watashichanchan

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問