Best practice for instantiating a new Android Fragment
android, android-fragments
Solution
If Android decides to recreate your Fragment later, it's going to call the no-argument constructor of your fragment. So overloading the constructor is not a solution.
With that being said, the way to pass stuff to your Fragment so that they are available after a Fragment is recreated by Android is to pass a bundle to the `setArguments` method.
So, for example, if we wanted to pass an integer to the fragment we would use something like:
public static MyFragment newInstance(int someInt) {
MyFragment myFragment = new MyFragment();
Bundle args = new Bundle();
args.putInt("someInt", someInt);
myFragment.setArguments(args);
return myFragment;
}
And later in the Fragment `onCreate()` you can access that integer by using:
getArguments().getInt("someInt", 0);
This Bundle will be available even if the Fragment is somehow recreated by Android.
Also note: `setArguments` can only be called before the Fragment is attached to the Activity.
This approach is also documented in the android developer reference: https://developer.android.com/reference/android/app/Fragment.html
Problem
I have seen two general practices to instantiate a new Fragment in an application: ``` Fragment newFragment = new MyFragment(); ``` and ``` Fragment newFragment = MyFragment.newInstance(); ``` The second option makes use of a static method `newInstance()` and generally contains the following method. ``` public static Fragment newInstance() { MyFragment myFragment = new MyFragment(); return myFragment; } ``` At first, I thought the main benefit was the fact that I could overload the newInstance() method to give flexibility when creating new instances of a Fragment - but I could also do this by creating an overloaded constructor for the Fragment. Did I miss something? What are the benefits of one approach over the other? Or is it just good practice?