2015年9月7日月曜日

FragmentArgs 使ってみた

FragmentArgs

Fragment 生成時に値を渡すには、引数付きのコンストラクタを用意するのではなく、Fragment.setArguments() で値を渡すのがベストプラクティスです。

FragmentArgs はアノテーションを付けたフィールドからFragmentのビルダークラスを生成してくれるライブラリです。

以下の内容は2015年9月7日時点の状態をもとにしています。



設定

Project の build.gradle buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.3.1' // apt を使うので以下が必要 classpath 'com.neenbedankt.gradle.plugins:android-apt:1.7' } } allprojects { repositories { jcenter() } } app の build.gradle apply plugin: 'com.android.application' // apt を使うので以下が必要 apply plugin: 'com.neenbedankt.android-apt' android { ... } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) // 以下が必要 compile 'com.hannesdorfmann.fragmentargs:annotation:2.1.2' apt 'com.hannesdorfmann.fragmentargs:processor:2.1.2' }

使い方 public class MainFragment extends Fragment { @Arg int userId; @Arg String name; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // @Arg を付けたフィールドに getArguments() から値が代入される FragmentArgs.inject(this); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Toast.makeText(getActivity(), "userId = " + userId + ", name = " + name, Toast.LENGTH_SHORT).show(); } } public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final MainFragment f = new MainFragmentBuilder("Android", 100) .build(); // 以下のメソッドも生成される // final MainFragment f = MainFragmentBuilder.newMainFragment("Android", 100); getSupportFragmentManager() .beginTransaction() .replace(android.R.id.content, f) .commit(); } }

Library Project での使い方

Library Project の build.gradle apply plugin: 'com.android.library' // apt を使うので以下が必要 apply plugin: 'com.neenbedankt.android-apt' // Library Project では以下を追加しないとコンパイルエラーになる apt { arguments { fragmentArgsLib true } } android { ... } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) // 以下が必要 compile 'com.hannesdorfmann.fragmentargs:annotation:2.1.2' apt 'com.hannesdorfmann.fragmentargs:processor:2.1.2' } 2015年9月7日時点の FragmentArgs の README だと fragmentArgsLib = true のように = がついてますが、android-apt:1.7 ではメソッドになったので = が必要ないです。

public class MainLibraryFragment extends Fragment { @Arg int userId; @Arg String name; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Library Project のときは生成されたビルダークラスの injectArguments() を利用する必要がある MainLibraryFragmentBuilder.injectArguments(this); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Toast.makeText(getActivity(), "userId = " + userId + ", name = " + name, Toast.LENGTH_SHORT).show(); } }


0 件のコメント:

コメントを投稿