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