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.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
java.lang.CharSequence
android.os.Parcelable
java.io.Serializable
java.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