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

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

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

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

641閲覧

インターフェースを実装して、カスタムダイアログフラグメントからフラグメントに値を送る

aruko

総合スコア47

Java

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2022/12/18 04:50

前提

フラグメント・・・
カスタムダイアログ・・・DialogFragmentKyoutuu.java(この中には番号によっていくつかのダイアログが出せるようになっている)

実現したいこと

インターフェースを実装して、カスタムダイアログから親フラグメントに値を送りたいが、カスタムダイアログのボタンに
public void onClick(DialogInterface dialogInterface, int i) {
listener.send_catch(DialogFagmentkyoutuu.this);// 処理を親のフラグメントにコールバックするメソッド
}
というのがネットに書いてありました。
この部分で「DialogInterface dialogInterface, int i」のようにイベントにインターフェースをつける書き方がわかりませんので、教えていただきたいです。
フラグメントの方で値を受ける書き方などは分かりましたが、この部分の書き方だけが分かりません。
コードは下にあります。

発生している問題・エラーメッセージ

今までは、ViewModelを使って値を送り、スレッドの中でその値を受けていましたが、フラグメントの数が増え、プログラムが複雑になる中でViewModelの値を受け取ることができないフラグメントが出てきたので、インターフェースでコールバックするやり方に変えようと試みています。

該当のソースコード 

DoalogFragmentKyoutuu.javaの中の一部 
36行目 public void onClick(View v)
の書き方をどのようにすればいいでしょうか。

java

1public class DialogFragmentKyoutuu extends DialogFragment { 2    ・ 3     ・ 4 //インスタンスを生成するメソッド 5 public static DialogFragmentKyoutuu newInstance() { 6 return new DialogFragmentKyoutuu(); 7 } 8 // イベントのコールバックを受け取るためのインターフェースを実装 9 public interface DialogFragmentKyoutuuListener { 10 void send_receive(DialogFragment dialog); 11 } 12 // クリックイベント発火を伝えるために使用するインターフェースインスタンスを定義 13 private DialogFragmentKyoutuuListener listener; 14 15 @Override 16 public void onAttach(Context context) {//アクティビティ,フラグメントと関連づいたとき 17 super.onAttach(context); 18 this.context = context; 19 try { 20 listener = (DialogFragmentKyoutuuListener) getTargetFragment(); 21 } catch (ClassCastException e) { 22 throw new ClassCastException(getTargetFragment().toString() + "はインターフェースを実装していません"); 23 } 24 } 25 public Dialog onCreateDialog(Bundle savedInstanceState){ 26    ・ 27    ・ 28    ・ 29    switch(dialog_num_kyoutuu){ 30     case 0:inflater=LayoutInflater.from(getActivity());//説明表示ダイアログ  31     view=inflater.inflate(R.layout.dialog_custom_kyouutuu_setumei,null); 32     builder.setView(view); 33     Button setumei_bt_tojiru=view.findViewById(R.id.setumei_bt_tojiru);//「閉じる・ゲームに戻る」ボタン 34     setumei_bt_tojiru.setOnClickListener( new View.OnClickListener(){ 35     @Override 36 public void onClick(View v) { 37 if( getActivity().getLocalClassName().equals("TitleActivity")){ 38 dismiss();//ダイアログを消す 39 DialogFragment dialog = new DialogFragmentKyoutuu(); 40 dialog_num_kyoutuu=3;//開始保存取り出しダイアログに進む 41 mainViewModel.setDialog_num_kyoutuu(dialog_num_kyoutuu); 42 dialog.show(getParentFragmentManager(), "dialog_kyoutuu"+dialog_num_kyoutuu); 43 }else { 44 set_flag_count_true();//アクティビティやフラグメントにコールバックするためのメソッド 45 dismiss();//ダイアログを消す 46 } 47 } 48 }); 49    ・ 50    ・ 51    ・ 52    ・ 53 void set_flag_count_true(){ 54 flag_from_dialog_kyoutuu=true; 55 mainViewModel.setFlag_from_dialog_kyoutuu(flag_from_dialog_kyoutuu); 56 if(fragment_num==0) {  //アクティビティにflag_count = trueという値を送る場合 57 flag_count = true; 58 ResultReceiver resultReceiver = (ResultReceiver) getActivity(); 59 resultReceiver.onReturnValue(0,0,flag_count,0,0);//flagnum(0:flag_count(fragmentではflag_count_fr) 1:flag_from_dialog 2:) 60 } 61 else {  //フラグメントにflag_count = trueという値を送る場合 62 flag_count_fr = true; 63 // 処理を親のフラグメントにコールバックする 64 listener.send_receive(DialogFragmentKyoutuu.this); 65 } 66 } 67    ・ 68    ・ 69    ・ 70    ・ 71

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

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

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

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

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

jimbe

2022/12/18 05:06 編集

>~というのがネットに書いてありました その URL もご提示願えますか。 >プログラムが複雑になる中でViewModelの値を受け取ることができないフラグメントが出てきた 普通にやっていれば ViewModel の値を取れないことはありません。 複雑さが度を越しているのではないでしょうか。 ( この共通ダイアログというクラスの存在自体・構造が巨大な switch がメインらしいことからも伺えます。 )
aruko

2022/12/18 07:28

https://qiita.com/tkmd35/items/507d9dd22629d775172e  や https://kyakujin.hatenadiary.org/entry/20140520/1400583111  で、そのように書いてあります。 はい、複雑さが度を越してているかもしれませんが、すべてViewModelに値を入れて必要な時に取り出すというやり方でやっているので、自分としてはシンプルにやっているつもりでした。 jimbeさんが前に提示していただいた、スレッドを使わないで会話を進める方法で一から作り直すしか方法はないでしょうか。
jimbe

2022/12/18 08:16

年末ということで例えるなら『日頃からこまめに掃除していれば大掃除は楽になる』という感じです。 ViewModel は、使ってさえいればあらゆる複雑さを無くしてくれる"銀の弾丸"では無いことは言うまでもありません。 ViewModel( と LiveData) によって初期表示やデータ更新→表示更新という処理がシンプルになるとはいえ、システムの構造がごちゃごちゃなっていては ViewModel 内もまたごちゃごちゃになっていくでしょう。
aruko

2022/12/18 08:44

jimbeいつもすみません。 少しでもやりがいのあるRPGゲームになるよう、複雑に入り組んだコードにしてしまい、自分の能力では直すことは不可能になってきたので、現在のコードを直すよりも1から作り直すほうがいいかもしれないと思い始めてきました。考えてみます。
jimbe

2022/12/18 09:20

シナリオをコード化してしまうと、シナリオが複雑になればコードが複雑になるのは仕方ないことです。 シナリオをどういう機能で表現できるのか、シナリオを表現するに足る最小限の機能は何なのかを探すのは、プログラマというよりシステムエンジニアの仕事で、コードが書けるという技能とはまた方向が違います。システムデザイナとも言えるでしょうか。 昔と違ってコンピュータで出来ることが多い分、開発の全作業の中で1人で出来ることが占める割合が相対的に減ってきました。その分を時間で埋められればまだ良いのですが、役割が違う 2 人で 1 日の作業が 1 人なら 2 日…という単純にはならないですから、苦労も相当になってしまいますね。 まぁ、このような場で考えることでは無いですが。
aruko

2022/12/18 10:53

jimbeさん、ゆとりがある時に趣味でやっているだけの私に色々お話して下さり、ありがとうございます。 javaプログラミングで、「画面に表すことができるものなら何でも作り出すことができる」ということが分かってから、その面白さにはまり、小さなものから複雑なものまで色々作ってきましたが、スマホアプリについては今のが2つ目で、デスクトップアプリとは仕組みや作り方が少々違うことが、自分にとって悩ましいところです。jimbeさんの18:20の内容をベストアンサーにしたいので、回答のところに移動してもらえるとありがたいです。
jimbe

2022/12/18 11:07 編集

18:20 のは質問の内容("インターフェースを実装して~")に対する回答とは全くなっていませんので、『最終的にご自身が本件をどういうことで解決としたのか』という点で自己回答を書いて頂いたほうが、後からこの質問を見た方には良いように思いますが、如何でしょうか。
guest

回答2

0

自己解決

jimbeさんが書いてくださったことが参考になりました。
「インターフェースを実装して、カスタムダイアログフラグメントからフラグメントに値を送る」という点が現在の問題点ではありますが、RPGゲームでかなり複雑な内容になってきているため問題が入り組んでいるように思います。プログラミングだけの問題ではないので、androidstudioでのスマホアプリの構造をある程度勉強してからこのゲーム作りを再開しようと思います。
ありがとうございました。

投稿2022/12/18 12:06

aruko

総合スコア47

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

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

0

public void onClick(DialogInterface dialogInterface, int i)

出所が分かりませんので確実はありませんが、恐らく アラートダイアログ に出てくるような DialogInterface.OnClickListener のメソッドのことと思います。
これ自体は単にそのようなインターフェースにダイアログの各ボタンの押下時にオブジェクトとボタンの種類が伝えられるというだけで、特別なことではありません。
オブジェクトを伝えたければそのようなインターフェースにするだけです。

36行目 public void onClick(View v)
の書き方をどのようにすればいいでしょうか。

該当メソッドから呼ばれている set_flag_count_true メソッドの最後の方に

// 処理を親のフラグメントにコールバックする listener.send_receive(DialogFragmentKyoutuu.this);

とありますが、これがそのまま

public void onClick(DialogInterface dialogInterface, int i) { listener.send_catch(DialogFagmentkyoutuu.this);// 処理を親のフラグメントにコールバックするメソッド }

と同じこと(パラメータが1つ多い/少ないだけ)です。DialogFragmentKyoutuu は DialogInterface では無いので DialogInterface としては書けませんが。

投稿2022/12/18 06:50

編集2022/12/18 07:24
jimbe

総合スコア12632

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問