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

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

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

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

Android Studio

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

Q&A

解決済

1回答

489閲覧

カスタムダイアログの値をフラグメントに送れない

aruko

総合スコア47

Java

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

Android Studio

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

0グッド

0クリップ

投稿2022/12/22 04:25

実現したいこと

カスタムダイアログのボタンを押した時の結果をフラグメント送りたいですが、どうしてもできません。教えてください。
アラートダイアログでの結果をフラグメントに送ることはできます。
どのように書き方を変えたらできるのでしょうか。
kotlinで書いてあるサイトはあるのですが、javaで書いてあるサイトが見つからず、javaで教えていただきたいです。
アラートダイアログの値を送ることはできているので、ソースコードはダイアログフラグメントのコードだけ載せます。

アラートダイアログのコード(値をフラグメントに送ることができている)

java

1public class SampleDialogFragment extends DialogFragment { 2 3 // インスタンスを生成するメソッド 4 public static SampleDialogFragment newInstance() { 5 return new SampleDialogFragment(); 6 } 7 // イベントのコールバックを受け取るためのインターフェースを実装 8 public interface SampleDialogListener { 9 void onDialogPositiveClick(DialogFragment dialog); 10 } 11 // クリックイベント発火を伝えるために使用するインターフェースインスタンスを定義 12 private SampleDialogListener listener; 13 14 // onAttach()で呼び出し元の親フラグメントがインターフェースを実装しているかを検証 15 // onAttach(): フラグメントのライフサイクルで最初に呼ばれるメソッドであり、 16 // フラグメントがアクティビティと関連づけられたときに一度だけ呼び出される。contextには所属親アクティビティが入っている・・・② 17 @Override 18 public void onAttach(Context context) { 19 super.onAttach(context); 20 try { 21 // 親フラグメントにイベントを送信できるように呼び出し元であるSampleFragmentオブジェクトを取得し、 22 // listenerのインスタンスを生成する 23 listener = (SampleDialogListener) getTargetFragment(); 24 } catch (ClassCastException e) { 25 // 親フラグメントがインターフェースを実装していない場合は例外を投げる 26 throw new ClassCastException(getTargetFragment().toString() + "はインターフェースを実装していません"); 27 } 28 } 29 // ダイアログを生成するonCreateDialog 30 @Override 31 public Dialog onCreateDialog(Bundle savedInstanceState) { 32 33 // ダイアログを生成する・・・③ 34 return new AlertDialog.Builder(getActivity()) 35 .setTitle("確認") 36 .setMessage("コールバックを開始しますか?") 37 .setPositiveButton("OK", new DialogInterface.OnClickListener() { 38 @Override 39 public void onClick(DialogInterface dialogInterface, int i) { 40 // 処理を親のフラグメントにコールバックする・・・④ 41 listener.onDialogPositiveClick(SampleDialogFragment.this); 42 } 43 }) 44 .setNegativeButton("キャンセル", null) // キャンセルボタンでは何もしないためnull 45 .create(); 46 } 47

カスタムダイアログのコード(カスタムダイアログをセットするところまで)

java

1 @Override 2 public Dialog onCreateDialog(Bundle savedInstanceState) { 3 //XMLとの紐付け 4 LayoutInflater inflater = getActivity().getLayoutInflater(); 5 View view = inflater.inflate(R.layout.layout_dialog, null, false); 6 7 //ダイアログの作成 8 Dialog dialog = new Dialog(getActivity()); 9 dialog.setContentView(view); 10   Button btOK=view.findViewById(R.id.btOK); 11 //OKボタンのリスナー 12 btOk.setOnClickListener(okButtonClickListener); 13// ここから下(上もおかしいかもしれません)、処理を親のフラグメントにコールバックする書き方を教えてください。 14 15 16 17 18 19 return dialog; 20 } 21}

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

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

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

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

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

guest

回答1

0

ベストアンサー

// ダイアログを生成する・・・③

の部分を AlartDialog から Dialog に変えるだけなら、ボタンクリック時の処理はほぼそのまま書くだけです。
つまり

java

1//OKボタンのリスナー 2btOk.setOnClickListener(new View.OnClickListener() { 3 @Override 4 public void onClick(View view) { 5 // 処理を親のフラグメントにコールバックする・・・④ 6 listener.onDialogPositiveClick(SampleDialogFragment.this); 7 } 8});

といった感じです。(※切り貼りしただけでコンパイル確認はしていません)
各ボタンのインターフェースは違ってもボタンが押されたら呼ばれるのは同じですので。

kotlinで書いてあるサイトはあるのですが、javaで書いてあるサイトが見つからず

kotlin は Android の公式なサポート言語ですので、今後もっと kotlin だけの記事が増えていくと思います。
java を元に作られたものですので、他の言語に比べれば何となく見たことある部分も多いと思いますし、多少なりとも読めるようになったほうが良いのでは無いでしょうか。
また、 AndroidStudio は java を kotlin に変換する機能も持っていますので、完全に同じ動作をするようにまで変換出来ているのかは分かりませんが、利用することも可能と思います。

投稿2022/12/22 05:20

編集2022/12/22 05:22
jimbe

総合スコア12646

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

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

aruko

2022/12/22 05:58

jimbeさん、ありがとうございます。 今までのプログラムから、ViewModelを使うものを減らし、違う方法でできるものはそちらに変更しているところです。 カスタムダイアログのボタンを押しても何も起こらないです。 画面もカスタムダイアログのままです。 よろしくお願いします。 kotlinは何となく分かりますが、正確に知りたかったので・・・。 変換機能使ってみたいと思います。
jimbe

2022/12/22 06:57 編集

>カスタムダイアログのボタンを押しても何も起こらないです。 btOk に設定した onClick に処理は移っているでしょうか。 移っていたら、リスナの該当メソッドに処理は移っているでしょうか。 >画面もカスタムダイアログのままです。 Dialog に setContentView したビュー内の処理は、 Dialog は関知しません。 setContentView したビュー内のボタンでダイアログを閉じたいのであれば、その処理を書く必要があります。 onClick メソッドの最後で dialog.dismiss() してください。
aruko

2022/12/22 08:55

カスタムダイアログなので、dismiss()が必要でした。ダイアログが消えたら、値が送られているのが表示されていました。 ありがとうございました。(^_^)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問