Androidの画面上に小さなウィンドを表示して様々な操作ができるダイアログ。何かしらの変更操作を終えダイアログを閉じた後に、それを反映させるためにダイアログの終了をアクティビティ側で検知したいことがあると思います。今回はそのダイアログの終了をアクティビティで検知する方法を紹介します。
Androidのダイアログ終了を検知するために
ダイアログのクラスにてインターフェースを定義し、それを呼び出し元であるアクティビティに実装すればできます。
ダイアログの終了は、onDestroy()で検知します。
サンプルコード
ボタンを押すとダイアログが表示されます。そのダイアログが閉じられるとそれを検知しアクティビティ上のテキストが更新されます。
ダイアログ
ダイアログのクラス内でインターフェースを定義します(ここではFragmentInterfaceという名前)。
またインターフェース内に空の関数finishDialog()を定義。
// ダイアログの終了検知用インターフェース internal var frgInterface:FragmentInterface? = null interface FragmentInterface{ fun finishDialog() }
またこのインターフェースのリスナーをonAttach内で設定します。
(contextはアクティビティ)
またダイアログ終了時に呼ばれるonDestroy内で関数finishDialogを呼びます。
override fun onAttach(context: Context) { super.onAttach(context) if(context is FragmentInterface){ frgInterface = context } } // ダイアログ終了時に呼ばれる override fun onDestroy() { super.onDestroy() frgInterface!!.finishDialog() }
onDestroyはダイアログ上の操作、「はい/いいえ」選択だけでなく、「戻る」操作でも呼び出されます。
アクティビティ
インターフェースをアクティビティクラスに実装、finishDialogをオーバーライドします。
ダイアログが終了すると、テキストビューの表示を更新します。
class MainActivity : AppCompatActivity(), DialogFragmentSample.FragmentInterface{ private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { // 省略 } // インターフェースの関数オーバーライド override fun finishDialog() { binding.tvGetfromFragment.text = "ダイアログが終了しました" } }
まとめ
フラグメント内のボタンタップイベントをアクティビティ側に渡すのと同じ感じですね。
コメント