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()
- }
- }
- 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'
- }
- 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 件のコメント:
コメントを投稿