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

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

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

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

Kotlin

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

Q&A

解決済

2回答

5134閲覧

DialogFragmentでどのボタンがクリックされたか、呼び出し元のActivityに知らせたい。

hood

総合スコア351

Android

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

Kotlin

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

0グッド

0クリップ

投稿2019/01/15 11:26

###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

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

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

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

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

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

guest

回答2

0

センスないかもしれませんが、助けになればと思い回答させていただきます。

章選択アクティビティで、例えば「1章」「2章」などを選択・押下した時点で
1・ダイアログを表示する
2・フラグを変更する(例えば var iを 1章なら1、2章なら2、…)
の2点を実行する

開始確認ダイアログでyesを押下した場合は、
1.ダイアログを閉じる
2.章選択アクティビティのメソッドを呼ぶ
このメソッドは、フラグiを参照してwhenなどで分岐し、画面遷移を行う。

ダイアログでcancelを押下した場合はダイアログを閉じるだけ。

kotlin詳しくないので申し訳ないのですが、
このままだとダイアログでyesを押した瞬間に
閉じる&アクティビティからの画面遷移が同時に見えるので

Handler().postDelayed(Runnable { val intent = Intent(this, Test2Activity::class.java) startActivity(intent) }, 1000)

のように時間差で画面遷移を実行すればイケるかと思います。

投稿2019/01/15 17:16

Kota_Kappa

総合スコア116

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

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

hood

2019/01/16 05:44

回答ありがとうございます!! アクティビティからの画面遷移については、今後どうしようか考えようと思っていました。 なので回答者さまに教えていただいたコードはありがたく、今後大いに参考にさせていただきます!
guest

0

ベストアンサー

FragmentからActivityにイベントを知らせるには、 getActivity() メソッド経由で通知をするのがスタンダードな方法です。
Fragment側でイベント通知用のinterfaceを定義して、Activity側はそれを実装してあげるとよいでしょう。今回の場合は、DialogInteface.OnClickListenerがそのまま使えそうなのでそれを利用すると楽です。

kotlin

1class StoryConfirmDialog : DialogFragment() { 2 inner class DialogButtonClickListener : DialogInterface.OnClickListener { 3 override fun onClick(dialog: DialogInterface?, which: Int) { 4 val a = activity 5 if (a is DialogInterface.OnClickListener) { 6 a.onClick(dialog, which) 7 } 8 } 9 } 10 11 ... 12}

kotlin

1class SelectActivity : FragmentActivity(), DialogInterface.OnClickListener { 2 ... 3 4 override fun onClick(dialog: DialogInterface?, which: Int) { 5 when (which) { 6 DialogInterface.BUTTON_POSITIVE -> { 7 } 8 DialogInterface.BUTTON_NEGATIVE -> { 9 } 10 } 11 } 12}

投稿2019/01/15 23:54

kakajika

総合スコア3131

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

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

hood

2019/01/16 05:41

回答ありがとうございます! 具体的なコードを書いてくださり、よく理解ができました。 また、getActivityがスタンダードな方法というのを知れたのは、とても大きなことで、本当に助かりました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問