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

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

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

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

Android Studio

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

Q&A

解決済

1回答

10084閲覧

FragmentからActivityへの値の受け渡し

tsuchin

総合スコア16

Java

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

Android Studio

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

0グッド

1クリップ

投稿2020/05/09 13:18

編集2020/05/09 14:40

FragmentのbuttonをクリックするとActivityに値が送られるようにしたいです。
インターネットで調べているのですが、Java初心者のため、どこに何を書けばよいのか理解できていません。
行き詰り、質問させて頂きいています。
今まで動作したコードを以下に記載します。
よろしくお願いします。

java

1// activity 2public class MainActivity extends AppCompatActivity { 3 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.activity_main); 8 9 Button button = findViewById(R.id.button); 10 11 button.setOnClickListener(new View.OnClickListener() { // ボタンクリックでフラグメントへ 12 @Override 13 public void onClick(View view) { 14 FragmentManager fm = getSupportFragmentManager(); 15 FragmentTransaction transaction = fm.beginTransaction(); 16 ParentFragment parentFragment = new ParentFragment(); 17 18 transaction.replace(R.id.container, parentFragment, "tagParentFragment"); 19 transaction.addToBackStack(null); 20 transaction.commit(); 21 } 22 }); 23 } 24} 25 26// fragment 27public class ParentFragment extends Fragment { 28 29 @Override 30 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 31 32 View view = inflater.inflate(R.layout.fragment_parent, container, false); 33 Button button2 = view.findViewById(R.id.button2); 34 35 String testStr = "テスト"; // Activityに送りたい値 36 37 button2.setOnClickListener(new View.OnClickListener() { // ボタンクリックでtestStrをActivityに送りたい。 38 @Override 39 public void onClick(View view) { 40 41 } 42 }); 43 } 44 return view; 45}

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

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

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

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

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

guest

回答1

0

ベストアンサー

これはもう定石として覚えるしかないと思います。

まず、Fragment ですが、

  1. interface を定義して、ボタンが押された時に呼ぶメソッドを宣言します。
  2. 上記 interface を listener フィールドに持たせます。
  3. onAttach メソッドの引数 context (実体は Activity) を listener に代入します。
  4. ボタンが押されたら listener のメソッドを呼びます。

java

1public class ParentFragment extends Fragment { 2 3 // 1. ボタンが押された時に呼ぶメソッドを持つインターフェイス 4 public interface ParentFragmentListener { 5 void onClickButton(String value); 6 } 7 8 // 2. 上記インターフェイスのフィールド 9 private ParentFragmentListener listener; 10 11 @Override 12 public void onAttach(@NonNull Context context) { 13 super.onAttach(context); 14 15 // 3. context を listener に代入 16 if (context instanceof ParentFragmentListener) { 17 listener = (ParentFragmentListener) context; 18 } 19 } 20 21 @Override 22 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 23 View view = inflater.inflate(R.layout.fragment_parent, container, false); 24 Button button2 = view.findViewById(R.id.button2); 25 26 final String testStr = "テスト"; // Activityに送りたい値 27 28 button2.setOnClickListener(new View.OnClickListener() { // ボタンクリックでtestStrをActivityに送りたい。 29 @Override 30 public void onClick(View view) { 31 // 4. listener のメソッドを呼ぶ 32 if (listener != null) { 33 listener.onClickButton(testStr); 34 } 35 } 36 }); 37 38 return view; 39 } 40}

あとは Activity で上記 interface を実装するだけです。

java

1public class MainActivity extends AppCompatActivity implements ParentFragment.ParentFragmentListener { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 8 // 略 9 } 10 11 @Override 12 public void onClickButton(String value) { 13 // ボタンが押された時の処理 14 Toast.makeText(this, "onClickButton: " + value, Toast.LENGTH_SHORT).show(); 15 } 16}

普通に考えたら new ParentFragment の時に直接 MainActivity の参照を渡してやればいい気がしますが、なんでこんな面倒くさいことをする必要があるかというと、画面回転の際などに、Activity も Fragment もいったん破棄されて作り直されるので、参照を渡しても無効になってしまうからで、Fragment が Activity 上に表示される際にはまず onAttach が呼ばれる (その時の context 引数として Activity が渡される) ので、その時に Activity の参照を捕まえる必要があります。

投稿2020/05/09 14:46

hoshi-takanori

総合スコア7895

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

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

tsuchin

2020/05/10 02:16 編集

ありがとうございます! 想定してたより難解でした。助かります。 具体的な例を教えて頂けたので、理解が出来そうな気がします。 まず動かしてみようと思ったところ、Activityの @Override public void onClickButton(String value) { の@Overrideでエラーが出たので削除したらbuildはできました。 あっていますでしょうか? testStrが送られているかどうか確認しようと思い、Activityにtextviewを設けて表示させてみたのですが、表示されません。コードを質問のところに追記しておきました。 申し訳ないのですが、原因が分かりましたら教えて頂けますでしょうか。
tsuchin

2020/05/10 02:14

すいません。質問のところに追記しようと思ったのですが、ここにします。 activityのToastの後に追記しました。 public void onClickButton(String value) { // ボタンが押された時の処理 Toast.makeText(this, "onClickButton: " + value, Toast.LENGTH_SHORT).show(); TextView textView = findViewById(R.id.textView); textView.setText(value); }
tsuchin

2020/05/10 02:45 編集

すいません!できました! activity側の先頭行のimplement以降の記述が漏れてました。 public class MainActivity extends AppCompatActivity implements ParentFragment.ParentFragmentListener { @overrideも教えて頂いた通りで大丈夫でした。 あと、textViewで表示しなくても、toastで表示できるんですね。 色々と大変勉強になりました。 本当にありがとうございました。 よく見て勉強したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問