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

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

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

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

Android

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

Q&A

解決済

2回答

2359閲覧

フラグメントからフラグメントのメソッドを実行したい

luckyclock

総合スコア74

Java

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

Android

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

0グッド

1クリップ

投稿2020/03/03 08:10

下記のようなフラグメントを実装しています。
activity
|
|________fragmentA
| |_____fragmentA1
| |_____fragmentA2
|________fragmentB

fragmentAはFragmentFragmentPagerAdapterでフラグメントA1とA2を切り換えることができます。
fragmentA1からfragmentAに実装されたfuncメソッドを実行したいのですが、このようなことは可能でしょうか?

FragmentA.java

java

1public class FragmentA extends Fragment { 2 3 private HomeViewModel homeViewModel; 4 5 // viewPager 6 private MyPagerAdapter pagerAdapter; 7 private ViewPager mPager; 8 9 public View onCreateView(@NonNull LayoutInflater inflater, 10 ViewGroup container, Bundle savedInstanceState) { 11 12 homeViewModel = 13 ViewModelProviders.of(this).get(HomeViewModel.class); 14 View root = inflater.inflate(R.layout.fragmentA, container, false); 15 16 return root; 17 } 18 19 @Override 20 public void onActivityCreated(Bundle savedInstanceState){ 21 super.onActivityCreated(savedInstanceState); 22 23 // Instantiate a ViewPager and a PagerAdapter. 24 mPager = (ViewPager) getActivity().findViewById(R.id.pager); 25 pagerAdapter = new MyPagerAdapter(getActivity().getSupportFragmentManager()); 26 mPager.setAdapter(pagerAdapter); 27 } 28 29 @Override 30 public void onStart() { 31 super.onStart(); 32 33 } 34 35 // fragmentA1から実行したい処理 36 public void func(){ 37 } 38 39} 40

FragmentA1.java

java

1 2 3public class FragmentA1 extends Fragment { 4 private View rootView; 5 @Override 6 public void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 } 9 10 @Override 11 public View onCreateView(@NonNull LayoutInflater inflater, 12 ViewGroup container, 13 Bundle savedInstanceState) { 14 rootView = inflater.inflate(R.layout.fragmentA1, container, false); 15 16 return rootView; 17 } 18 19 @Override 20 public void onActivityCreated (Bundle savedInstanceState) { 21 super.onActivityCreated(savedInstanceState); 22 } 23 24 @Override 25 public void onStart() { 26 super.onStart(); 27 28 Button info = (Button)getActivity().findViewById(R.id.buttonInfo); 29 30 info.setOnClickListener(new View.OnClickListener() { 31 // infoボタン 32 @Override 33 public void onClick(View v) { 34 // ここでフラグメントAに実装されたfunc処理を実行したい 35 } 36 }); 37 } 38}

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

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

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

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

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

guest

回答2

0

ベストアンサー

Fragmentが入れ子状の構造になっているのでしたら、親子関係を持たせてしまうのがシンプルな方法です。親子関係になっていて子から親の参照を取得するのであれば、jimbeさんが言及されているような面倒な問題は起こりません。

  • FragmentA

java

1pagerAdapter = new MyPagerAdapter(getChildFragmentManager());
  • FragmentA1

java

1((FragmentA) getParentFragment()).func();

ViewModelをすでに導入済みなら、ViewModelを共有することでFragment間のやり取りをする方が汎用性が高いのでおすすめです。親子関係でないFragment間も、こちらの方法ならやり取りが可能です。

投稿2020/03/03 14:00

kakajika

総合スコア3131

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

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

luckyclock

2020/03/03 23:27

viewModel導入してはいるんですが、プロジェクト作成時のテンプレで勝手に作成されたものなので自分自身使い方を理解していませんので勉強してみます。
luckyclock

2020/03/04 04:25

ひとまずは教えていただいたコードでfragmentA1からのメソッドの呼び出しはできました。 ありがとうございます。
guest

0

Fragment はシステムによって破棄・再生成される可能性がありますので, その参照を保持して操作することは難しい(面倒くさい?)と思います.
Activity (や ViewModel) を経由するのが妥当かと思います.
といいますか, 行っているのは Activity のボタンへの OnClickListener の登録のようですが, であれば, Activity で行えばよいのではないでしょうか.

投稿2020/03/03 13:23

jimbe

総合スコア13209

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

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

luckyclock

2020/03/03 23:25

ボタンはフラグメントA1のxmlに配置しています。 activityですべてのボタンの処理を記載するのはactivityのコードが膨らむので、それぞれのフラグメント.javaに処理を書いたほうがいいかと思いました。 勉強不足でどういう処理をactivityにもたすべきか、どういう処理をfragmentにもたすべきかいまいち定石みたいなのがわかっていないんですよね。
kakajika

2020/03/04 01:53

Fragment内のViewに関する処理はそれぞれのFragmentでやるべきという考え方は合っていますが、実装がそのようになっていないということを指摘されているのだと思います。以下のように修正すると、ActivityとFragmentの切り分けが明確なコードになります。 - Activity経由でViewを取得するのをやめる - onActivityCreatedではなくonViewCreatedの方でViewの設定を行う
jimbe

2020/03/04 04:27 編集

> ボタンはフラグメントA1のxmlに配置しています。 でしたら onCreateView で行って良いのではないでしょうか. kakajika さんの回答から, 呼び出し元・先の関係を (A1→A のはずが A1→B と) 勘違いしていたことに気が付きました, すいません. > 定石みたいなの MVC とか MVVM とかでしょうか. 理論は色々あると思いますが, > activityですべてのボタンの処理を記載するのはactivityのコードが膨らむので、それぞれのフラグメント.javaに処理を書いたほうがいいかと 仰る通り役割毎に処理を分ける前提と思いますので, fragment 間でメソッドの呼び出しを行うこともしないのではと思います. MVVM 的になるかもしれませんが, 機能的な処理は Model が行い(必要なデータも全て Model が持ちます), fragment は (ViewModel を通じて) 結果を表示するだけとし, ボタンを押した場合は Model のメソッドを呼び, Model 内部のデータの変化によって (ViewModel を通じて ) 各 fragment の表示が更新される…という構造が, 個人的には分かり易いです.
jimbe

2020/03/04 04:30

書き込みタイミングが丁度重なったようで, kakajika さんのコメントとダブってしまう形になってしまいました. orz
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問