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?

Original source

Related problems