New fragment instance generator
This library generate final class with static "newInstance" methods.
For example:
You have FooFragment class. Frarg generate static method newFooFragmentInstance which return fragment intance.
dependencies {
implementation 'com.riningan.frarg:frarg:1.1'
implementation 'com.riningan.frarg:frarg-annotations:1.1'
annotationProcessor 'com.riningan.frarg:frarg-processor:1.1'
}
Add @ArgumentedFragment() annotation to fragment class.
@ArgumentedFragment
public class FooFragment extends Fragment {}
Generated method:
public static FooFragment newFooFragmentInstance() {
FooFragment fragment = new FooFragment();
android.os.Bundle bundle = new android.os.Bundle();
fragment.setArguments(bundle);
return fragment;
}
Add @ArgumentedFragment() annotation to fragment class.
Add @Argument annotation to field which will be argument.
@ArgumentedFragment
public class FooFragment extends Fragment {
@Argument
String mArgumentString = null;
@Argument
int mArgumentInt = 0;
}
In this case Frarg generate argument class:
public final class FooFragmentArgs {
public String mArgumentString;
public int mArgumentInt;
public FooFragmentArgs(String mArgumentString, int mArgumentInt) {
this.mArgumentString = mArgumentString;
this.mArgumentInt = mArgumentInt;
}
}
And two static methods:
public static FooFragment newFooFragmentInstance(String mArgumentString, int mArgumentInt) {
FooFragment fragment = new FooFragment();
android.os.Bundle bundle = new android.os.Bundle();
bundle.putString("mArgumentString", mArgumentString);
bundle.putInt("mArgumentInt", mArgumentInt);
fragment.setArguments(bundle);
return fragment;
}
public static FooFragment newFooFragmentInstance(FooFragmentArgs args) {
return newFooFragmentInstance(args.mArgumentString, args.mArgumentInt);
}
For bind arguments to fields use method:
FrargBinder.bind(this);
Where this is FooFragment instance.
For example:
@ArgumentedFragment
public class FooFragment extends Fragment {
...
@Override
public void onAttach(Context context) {
super.onAttach(context);
FrargBinder.bind(this);
}
}
Add @ArgumentedFragment() annotation to class which contain declared arguments fileds.
Add fragment class name to fragmentCls parameter in @ArgumentedFragment() annotation.
Add @Argument annotation to field which will be argument.
@ArgumentedFragment(fragmentClass = FooFragment.class)
public class FooPresenter {
@Argument
ArrayList<String> mPresenterArgumentString = null;
@Argument
int mPresenterArgumentInt = 0;
}
In this case Frarg generate argument class and two static methods like "Fragment with arguments".
For bind arguments to fields use method:
FrargBinder.bind(this, bundle);
Where this is FooPresenter instance and bundle is FooFragment::getArguments().
For example:
public class FooFragment extends Fragment {
FooPresenter presenter = new FooPresenter();
@Override
public void onAttach(Context context) {
super.onAttach(context);
presenter.bind(getArguments());
}
}
@ArgumentedFragment(fragmentClass = FooFragment.class)
public class FooPresenter {
...
public void bind(Bundle bundle) {
FrargBinder.bind(this, bundle);
}
}
Or call FrargBinder.bind in fragment class.
For example:
public class FooFragment extends Fragment {
FooPresenter presenter = new FooPresenter();
@Override
public void onAttach(Context context) {
super.onAttach(context);
FrargBinder.bind(presenter, getArguments());
}
}
Add parameter optional to @Argument annotation.
For example:
@ArgumentedFragment
public class FooFragment extends Fragment {
@Argument(optional = true)
String mArgumentString = null;
}
In this case Frarg generate argument class:
public final class FooFragmentArgs {
public String mArgumentString;
public boolean mArgumentStringInitialized;
public FooFragmentArgs(String mArgumentString) {
this.mArgumentString = mArgumentString;
this.mArgumentStringInitialized = true;
}
public FooFragmentArgs() {
}
}
if argument passed to FooFragmentArgs constructor, it will received in FrargBinder.bind.
Beware if using more than one optional argument with the same type. In this case Frarg generate argument class:
public final class FooFragmentArgs {
public String mArgumentString1;
public boolean mArgumentString1Initialized;
public String mArgumentString2;
public boolean mArgumentString2Initialized;
public FooFragmentArgs(String mArgumentString1, String mArgumentString2) {
this.mArgumentString1 = mArgumentString1;
this.mArgumentString1Initialized = true;
this.mArgumentString2 = mArgumentString2;
this.mArgumentString2Initialized = true;
}
public FooFragmentArgs(String mArgumentString1) {
this.mArgumentString1 = mArgumentString1;
this.mArgumentString1Initialized = true;
}
public FooFragmentArgs() {
}
}
Only one value will be passed as argument.
FragmentBuilder.newFooFragmentInstance();
FragmentBuilder.newFooFragmentInstance("param", 101)
or
FragmentBuilder.newFooFragmentInstance(new FooFragmentArgs("param", 101));
If you have two fragment class with same name in different packages, you need use alias:
@ArgumentedFragment(alias = "FragmentNotD")
class FragmentD : Fragment() {
}
In this case Frarg generate method:
public static FragmentD newFragmentNotDInstance() {
FragmentD fragment = new FragmentD();
android.os.Bundle bundle = new android.os.Bundle();
fragment.setArguments(bundle);
return fragment;
}
All types which can be putting to bundle.
https://developer.android.com/reference/android/os/Bundle
And Enum classes:
public enum ArgEnum {
FIRST, SECOND, THIRD
}
@Argument
ArgEnum mArgumentEnum = null;
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.