はじめに
Androidアプリを実装するうえで、便利なライブラリを教わったので使い方などをまとめます。
内容は順次更新していきます。
なお、開発環境は以下の通りです。
-
AndroidStudio ver2.2.2
-
FragmentArgs ver3.0.2
FragmentArgsとは
アプリを実装しようとすると画面遷移の際に引数を渡したいことがあると思います。
通常、IntentやBundleに"Key:value"の形式で格納し遷移する際に渡しますが、
画面数や引数が増えるにつれてコードが長くなり可読性が低下する原因となってしまいます。
そもそもコードの量が増えるといろいろとミスなどが・・・
そのような場面で活躍するのがFragmentArgsです。
FragmentArgsはFragmentからビルダークラスを自動で生成することで、
Fragment間のデータのやり取りを簡略化
してくれます。
FragmentArgsの導入方法
導入方法はgitのページを参考にしました。
FragmentArgsを導入するには、下記の内容を追加します。
- 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)
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の使い方
おおまかな処理の流れ
- (呼び出し元)Builderクラスを用いて遷移先を生成。このとき、渡したい値を引数とする。
- (呼び出し先)
FragmentArgs.inject(this)
で渡された値を取得する。 - (呼び出し先)取得した値を
@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
をつけるのを忘れないようにしてください。
@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を渡すので、必要に応じてthis
をgetActivity()
に書き換えてください。