###DialogFragmentでどのボタンがクリックされたか、呼び出し元のActivityに知らせたい。
私はノベルゲームを作っているのですが、いわゆる「章選択」の実装でつまっています。
私は以下のようなワークフローで章選択画面からストーリー画面への遷移を実現したいと思いました。
1:章選択画面ので、リストの中の一つの章をクリック
2:章を始めるか確認するAlertDialog表示
3:OKだったらストーリー画面に遷移、NOだったらそのままAlertDialogを消す。
この3の部分。私はAlertDialogから直接の遷移ではなく、章選択画面からの遷移をしたいと思っています。
理由はActivityのほうが、フェードアウトアニメーションなどをつけるのに都合がいいからです。
そこでタイトルの質問に行き着きました。DialogFragmentでどのボタンがクリックされたか、呼び出し元のActivityに知らせるにはどうすればよいのでしょうか?それがわかれば遷移もできそうな気が、なんとなくしています・・・
一応ネットで転がっている情報も漁ったのですが、DialogFragmentの実装方法は千差万別らしく、なかなか自分と似たことをしている人は見つけられませんでした・・・
以下にコードを示します。
どうかご教授いただけると助かります。
kotlin
1//選択アクティビティ 2class SelectActivity : FragmentActivity() { 3 4 /*リスナをメンバー変数に。物語確認ダイアログを表示*/ 5 private inner class ListStoryClickListener: AdapterView.OnItemClickListener { 6 override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { 7 //・・・省略 8 //確認ダイアログを表示。 9 val storyConf = StoryConfirmDialog() 10 storyConf.show(supportFragmentManager,"Confirm Story") 11 StoryConfirmDialog.DialogButtonClickListener() 12 //おそらくここでなにかする・・・? 13 } 14 } 15 16 override fun onCreate(savedInstanceState: Bundle?) { 17 super.onCreate(savedInstanceState) 18 setContentView(R.layout.activity_select) 19 //章の選択画面を作り、リスナを追加 20 val lvStory:ListView=findViewById(R.id.list_Story) 21 lvStory.onItemClickListener = ListStoryClickListener() 22 //・・・省略 23 24 } 25 26 27 28} 29
kotlin
1//確認ダイアログ 2class StoryConfirmDialog : DialogFragment() { 3 /*リスナをメンバー変数に。*/ 4 class DialogButtonClickListener : DialogInterface.OnClickListener{ 5 override fun onClick(dialog: DialogInterface?, which: Int) { 6 when(which){ 7 DialogInterface.BUTTON_POSITIVE->{ 8 //アニメーションや分岐の関係で、ここで直接の遷移はしたくない。 9 //クリックされたことをAcitivityに知らせるには? 10 } 11 DialogInterface.BUTTON_NEGATIVE->{ 12 13 } 14 } 15 } 16 } 17 18 override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { 19 /*ここでアラートダイアログを作り、それぞれのボタンにリスナを実装*/ 20 /*ダイアログビルダーを生成。どのアクティビティから呼ばれるかわからないから引数にはactivity*/ 21 val builder = AlertDialog.Builder(activity).apply { 22 setTitle("選択確認") 23 setMessage("選択した物語を開始します。よろしいですか?") 24 setPositiveButton("はい",DialogButtonClickListener()) 25 setNegativeButton("いいえ",DialogButtonClickListener()) 26 } 27 /*ダイアログオブジェクトを生成アンドリターン*/ 28 return builder.create() 29 } 30 31} 32
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/16 05:44