Java
Android

FragmentArgsを使ってみたまとめ

はじめに

Androidアプリを実装するうえで、便利なライブラリを教わったので使い方などをまとめます。
内容は順次更新していきます。

なお、開発環境は以下の通りです。

  • AndroidStudio ver2.2.2

  • FragmentArgs ver3.0.2

FragmentArgsとは

アプリを実装しようとすると画面遷移の際に引数を渡したいことがあると思います。
通常、IntentやBundleに"Key:value"の形式で格納し遷移する際に渡しますが、
画面数や引数が増えるにつれてコードが長くなり可読性が低下する原因となってしまいます。
そもそもコードの量が増えるといろいろとミスなどが・・・

そのような場面で活躍するのがFragmentArgsです。
FragmentArgsはFragmentからビルダークラスを自動で生成することで、
Fragment間のデータのやり取りを簡略化

してくれます。

FragmentArgsの導入方法

導入方法はgitのページを参考にしました。
FragmentArgsを導入するには、下記の内容を追加します。

  • build.gradle(Project)
build.gradle(Project)
dependencies{
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.7'  
}

allprojects {
    repositories {
        maven {  url "https://oss.sonatype.org/content/repositories/snapshots/"  }
    }
}
  • build.gradle(app)
build.gradle(app)
apply plugin: 'com.neenbedankt.android-apt'

dependencies {
    compile 'com.hannesdorfmann.fragmentargs:annotation:3.0.2'
    compile 'com.hannesdorfmann.fragmentargs:bundler-parceler:3.0.2'
    apt 'com.hannesdorfmann.fragmentargs:processor:3.0.2'
}

※gradleプラグインが2.2以上の場合「apt」を「annotationProcessor」とする必要があるようです。

FragmentArgsの使い方

おおまかな処理の流れ

  1. (呼び出し元)Builderクラスを用いて遷移先を生成。このとき、渡したい値を引数とする。
  2. (呼び出し先)FragmentArgs.inject(this)で渡された値を取得する。
  3. (呼び出し先)取得した値を@Argのついた変数に格納する。

値の渡し方(MyFragmentへuserName,ageを渡す場合)

   MyFragment myFragment = new MyFragmentBuilder(userName,age).build();

MyFragmentBuilderはFragmentArgsによって自動で生成されるクラスです。
[Run:app]をすることで生成されるので、最初はエラーとなっていても気にせず実行してみましょう。
builderが生成されない場合は、Tipsで紹介している方法を試してみてください。

値の受け取り方

  • 受け取った値を格納する変数(今回はuserName,age)を宣言する。 FragmentArgsは下記のフィールドからビルダークラスを生成します。
  @Arg
    String userName;
    @Arg
    int age;

このとき@Arg(required = false)と記述するとオプション引数とすることができます。
変数にprivateをつけることもできます。その場合は、setter,getterを忘れずに用意しましょう。

  • 宣言した変数に格納する(OnCreate内に記述)
FragmentArgs.inject(this)

上記のコードがgetArgments()に相当し、@Argのついた変数に代入します。

まとめると下記のようなコードになります。
※このとき、クラス名の前に@FragmentWithArgsをつけるのを忘れないようにしてください。

myFragment.java
@FragmentWithArgs
public class myFragment extends Fragment {

    @Arg
    String userName;

    @Arg
    int age;

    public myFragment() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FragmentArgs.inject(this);
    }

Tips

builderが自動で生成されない場合の対処

Gradleの記述が誤っている可能性があります。記述場所、記述内容(verなど)をもう一度確認してみましょう。
※aptとannotationParserの記述ミスに注意してください。

記述に誤りがない場合は、プロジェクトをクリーンすることで動作する場合もあります。
AndroidStudioの場合 :
[メニュー]→[build]→[clean Project]とすることでプロジェクトをクリーンできます。

値を渡す際の引数の順番

基本的にはFragment内で宣言した順番でコンストラクタが生成されます。builder内の引数の順番とFragment内にあるArgのついた変数の順番を一致させるようにしましょう。

なぜか私のコードは順番がバラバラで構築されるので原因を調査中です。。

DialogFragmentを利用する場合

DialogFragmentを継承したクラスに値を渡したいときはFragmentArgs.inject(this)OnCreateDialog()内に記述します。
thisはactivityを渡すので、必要に応じてthisgetActivity()に書き換えてください。