Graham Smith Graham Smith - 1 year ago 90
Android Question

Best practice for instantiating a new Android Fragment

I have seen two general practices to instantiate a new Fragment in an application:

Fragment newFragment = new MyFragment();


Fragment newFragment = MyFragment.newInstance();

The second option makes use of a static method
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?

Answer Source

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);

    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.