2015年9月7日月曜日

FragmentArgs 使ってみた

FragmentArgs

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

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

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



設定

Project の build.gradle
  1. buildscript {  
  2.     repositories {  
  3.         jcenter()  
  4.     }  
  5.     dependencies {  
  6.         classpath 'com.android.tools.build:gradle:1.3.1'  
  7.         // apt を使うので以下が必要  
  8.         classpath 'com.neenbedankt.gradle.plugins:android-apt:1.7'  
  9.     }  
  10. }  
  11.   
  12. allprojects {  
  13.     repositories {  
  14.         jcenter()  
  15.     }  
  16. }  
app の build.gradle
  1. apply plugin: 'com.android.application'  
  2. // apt を使うので以下が必要  
  3. apply plugin: 'com.neenbedankt.android-apt'  
  4.   
  5. android {  
  6.     ...  
  7. }  
  8.   
  9. dependencies {  
  10.     compile fileTree(dir: 'libs', include: ['*.jar'])  
  11.   
  12.     // 以下が必要  
  13.     compile 'com.hannesdorfmann.fragmentargs:annotation:2.1.2'  
  14.     apt 'com.hannesdorfmann.fragmentargs:processor:2.1.2'  
  15. }  


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


Library Project での使い方

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

  1. public class MainLibraryFragment extends Fragment {  
  2.   
  3.     @Arg  
  4.     int userId;  
  5.   
  6.     @Arg  
  7.     String name;  
  8.   
  9.     @Override  
  10.     public void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         // Library Project のときは生成されたビルダークラスの injectArguments() を利用する必要がある  
  13.         MainLibraryFragmentBuilder.injectArguments(this);  
  14.     }  
  15.   
  16.     @Override  
  17.     public void onActivityCreated(Bundle savedInstanceState) {  
  18.         super.onActivityCreated(savedInstanceState);  
  19.   
  20.         Toast.makeText(getActivity(), "userId = " + userId + ", name = " + name, Toast.LENGTH_SHORT).show();  
  21.     }  
  22. }  



0 件のコメント:

コメントを投稿