FragmentからFragmentへのcallbackを実装する2017年02月26日(編集2017年02月26日)TweetAndroidアプリ開発では、Fragmentでcallbackを利用することで、関連づいたActivityやFragmentに任意のデータや結果を渡すことができます。この記事は、FragmentからFragmentへのcallbackの実装方法を記載した記事です。中級者向けサンプルコードAndroid-Basic-Technique-Democallbackcallbackは、呼び出し先の関数の実行中に実行されるように、あらかじめ指定しておく関数のことです。重要なプログラミングスキルですが、言葉だけでは内容が伝わりにくいテクニックです。callbackの実装経験がない場合は、インターフェースを使って、クラスから他のクラスのメソッドを呼び出すという考え方を頭に入れておくと良いでしょう。アプリ設計サンプルとして、以下のようなActivityとFragmentの構成のアプリを作成します。アプリ構成FragmentA内でFragmentBを生成し、FragmentBからFragmentAにcallbackします。作成するアプリの画面は以下です。FragmentA)画像をタッチして、画像フィルターを選択するダイアログを表示します。DialogFragment(FragmentB)フィルターを選択するとcallbackが実行されて画像表示画面に戻ります。FragmentA)画像表示画面と画像選択ダイアログを別々のFragmentで作成します。実装まずは画面のベースになるActivityを作成します。クラス名はCallBackFromFragmentToFragmentActivityにします。}}ImageFragmentを管理するだけのActivityです。ActivityにFragmentを付加してます。続いて、画面を表示するFragmentを作成します。クラス名はImageFragmentにします。このImageFragmentは、別のFragmentのコールバックを受けるFragmentです。setTargetFragmentsetTargetFragmentメソッドは、別のFragmentの結果を戻すために使用するメソッドです。ImageFragment.REQUEST_CODE_IMAGE_FILTER_DIALOG);第1引数は生成したFragment(ImageFilterDialogFragment)で利用するFragment(ImageFragment)を設定します。場合、this(呼び出し元のFragment)を設定します。第2引数はリクエストコードを設定します。このリクエストコードはonActivityResultメソッドでも使用するので、定数にします。onActivityResultonActivityResultメソッドは、デフォルトではstartActivityForResultメソッドの結果を受け取ります。このサンプルでは、別のFragment(ImageFilterDialogFragment)から呼び出されるonActivityResultメソッドの結果を受け取ります。}}onActivityResultメソッド実行時に引数で渡したリクエストコードと結果コードを受け取り、トーストを表示します。最後に、ダイアログ画面を表示するDialogFragmentを作成します。クラス名はImageFilterDialogFragmentにします。setItemsAlertDialogの選択項目に配列のxmlを使用します。xmlは/res/values-ja/フォルダにarrays.xmlファイルの名前で作成します。{xmlではresources属性内にstring-array属性を記述します。</string-array></resources>getResources().getTextArrayが呼び出されて、ダイアログで表示できます。getTargetFragmentgetTargetFragment()メソッドは、setTargetFragmentで設定したFragementを返します。このサンプルでは、ImageFragmentです。intent);上記はImageFragmentのonActivityResultメソッドを任意に呼び出しています。本来onActivityResultメソッドはstartActivityForResultから呼び出されますが、ここではコールバックメソッドとして利用しています。引数のリクエストコードは、setTargetFragmentで設定したリクエストコードをgetTargetRequestCodeメソッドで取得して設定しています。ビルド上記のコードビルドして動作を確認します。appImageFilterDialogFragmentからImageFragmentにcallbackできました。結論FragmentからFragmentへのコールバックの方法はいくつかあります。この記事で説明した方法が一番安定した動作で、コードの可読性も良いと思います。FragmentからFragmentへのコールバックが必要な時はこの方法を利用してみてください。