Fragment Creator is a code generation library to manage fragment class creation and arguments for Android.
I wrote the newInstance method every time when declaring a new Fragment. Then, call Fragment#getArguments() and call a get method that is adapted parameter type (ex. getString(), getParcelable()). It's so a boring boilerplate code.
This library helps you to manage fragment class creation and arguments.
Fragment Creator 2.0.0 or later supports AndroidX. It can be used only with androidx.fragment.app.Fragment.
@FragmentCreator
public class MainFragment extends Fragment {
@Args
String keyword;
@Args(require = false)
String userId;
}Then, MainFragmentCreator is generated.
MainFragment instance = MainFragmentCreator
.newBuilder("keyword")
.build();
MainFragment instance = MainFragmentCreator
.newBuilder("keyword") // required
.setUserId("mike") // optional
.build();public MainFragment extends Fragment {
@Args
String keyword;
@Args(require = false)
String userId;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MainFragmentCreator.read(this);
// this.keyword, this.userId are initialized.
}
}You can set default value.
public MainFragment extends Fragment {
// The default value can be set only if the argument is optional.
@Args(require = false, defaultString = "unknown")
String keyword;
@Args(require = false, defaultInt = -1)
int userId;
}Supported types
- primitive type
- java.lang.String
- java.lang.Boolean
- java.lang.Byte
- java.lang.Character
- java.lang.Short
- java.lang.Integer
- java.lang.Long
- java.lang.Float
- java.lang.Double
You should declare a setter method if using private field.
public MainFragment extends Fragment {
@Args
String keyword;
@Args(require = false)
private String userId;
public String setUserId(String userId){
this.userId = userId;
}
}If you want to use the class such as the following, you can use the ArgsSerializer.
// It is not Serializable or Parcelable.
public class Product {
public int id;
public String name;
}At first, define a class that implements the ArgsSerializer.
public class StringSerializer implements ArgsSerializer<Product, String> {
@Override
public String serialize(Product product) {
return product.getId() + "," + product.getName();
}
@Override
public Product deserialize(String str) {
String[] split = str.split(",");
Product product = new Product();
product.setId(Integer.parseInt(split[0]));
product.setName(split[1]);
return product;
}
}Set @Serializer.
@FragmentCreator
public class MainFragment extends Fragment {
@Args
@Serializer(to = String.class, serializer = StringSerializer.class)
Product product;
//...- primitive type
java.lang.Stringjava.lang.Booleanjava.lang.Bytejava.lang.Characterjava.lang.Shortjava.lang.Integerjava.lang.Longjava.lang.Floatjava.lang.Doublejava.lang.CharSequenceandroid.os.Parcelablejava.io.Serializablejava.util.ArrayList<? extends android.os.Parcelable>java.util.ArrayList<java.lang.Integer>java.util.ArrayList<java.lang.String>java.util.ArrayList<java.lang.CharSequence>
android.os.Parcelable[]android.util.SparseArray<? extends android.os.Parcelable>boolean[]byte[]short[]char[]int[]long[]float[]double[]java.lang.String[]java.lang.CharSequence[]android.os.Bundle
This library is distributed by JitPack. Add dependencies your build.gradle
apt 'com.github.sys1yagi.fragment-creator:processor:2.0.0'
compile 'com.github.sys1yagi.fragment-creator:library:2.0.0'
Show version
$ ./gradlew version
Bump version
$ ./gradlew bumpMajor
$ ./gradlew bumpMinor
$ ./gradlew bumpPatch
Generate README
$ ./gradlew genReadMe