以下のサイトを参考にし、自分用にメモと実装例を残しました。詳しくは以下のサイトをご覧ください。
https://tech.mokelab.com/android/Fragment/dialog.html
https://tech.mokelab.com/android/Fragment/result.html
ここで紹介するのは、2020年9月10日の現時点で、安定な1.2.5
でのやり方です。
fragment1.3.0-alpha04
からは別の方法がありますので、下の公式ドキュメント参考にしてください。
https://developer.android.com/training/basics/fragments/pass-data-between
ここでのDialogFragmentは、よくある2択を選択するダイアログを表示させ、文字列を呼び出し元のfragmentに返すという機能とします。
プログラミング言語はKotlinを採用しております。
呼び出すFragmentオブジェクトを生成
// 呼び出すFragmentオブジェクトを生成(CUSTOM_DIALOG_CALLはこちらで定義)
val customDialogFragmet = CustomDialogFragmet.newInstance(this@FirstFragment, CUSTOM_DIALOG_CALL)
CustomDialogFragmet.show(parentFragmentManager, "CustomDialogFragmet")
呼び出し先からの結果をonActivityResult
で受け取る
// customFragmentから結果を受け取る
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == CUSTOM_DIALOG_CALL && resultCode == Activity.RESULT_OK) {
if (data != null) {
// やりたいこと
val text = data?.getStringExtra(Intent.EXTRA_TEXT)
if (text != null) Log.d("debug", text)
}
}
}
setTargetFragmentで呼び出し元のfragmentオブジェクトとrequestCodeをセット
companion object {
// set: fragment object, requestCode
@JvmStatic
fun newInstance(fragment: Fragment, requestCode: Int): CustomFragment {
val dialog = CustomDialogFragmet()
dialog.setTargetFragment(fragment, requestCode)
val args = Bundle()
fragment.arguments = args
return dialog
}
}
呼び出された側で、結果を伝えるためにtargetFragmentで、呼び出し元のfragmentオブジェクトを取得
putExtraで渡したい値をセット
private fun onSubmit(inputText: String) {
if(targetFragment == null) return
val data = Intent()
data.putExtra(Intent.EXTRA_TEXT, inputText)
targetFragment!!.onActivityResult(targetRequestCode, Activity.RESULT_OK, data)
}
class CustomFragment: DialogFragment() {
companion object {
// set: fragment object, requestCode
@JvmStatic
fun newInstance(fragment: Fragment, requestCode: Int): CustomFragment {
val dialog = CustomFragment()
dialog.setTargetFragment(fragment, requestCode)
val args = Bundle()
fragment.arguments = args
return dialog
}
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
if(activity == null) return super.onCreateDialog(savedInstanceState)
val dialog: AlertDialog.Builder = AlertDialog.Builder(activity)
dialog.setTitle("2択")
dialog.setPositiveButton("はい", onPositiveClick())
dialog.setNegativeButton("いいえ", onNegativeClick())
return dialog.create()
}
override fun onPause() {
super.onPause()
dismiss() // メモリリーク対策
}
private inner class onPositiveClick(): DialogInterface.OnClickListener {
override fun onClick(dialog: DialogInterface?, which: Int) {
onSubmit(”はい”)
}
}
private inner class onNegativeClick(): DialogInterface.OnClickListener {
override fun onClick(dialog: DialogInterface?, which: Int) {
onSubmit("いいえ")
}
}
private fun onSubmit(inputText: String) {
if(targetFragment == null) return
val data = Intent()
// 呼び出し元に渡したいデータ
data.putExtra(Intent.EXTRA_TEXT, inputText)
targetFragment!!.onActivityResult(targetRequestCode, Activity.RESULT_OK, data)
}
}
Kotlin、Android共に初心者ながら書いてみました。
Kotlinに早く慣れたい今日この頃
早く安定版の更新来ないかな