The newInstance pattern
suggest changeAlthough it is possible to create a fragment constructor with parameters, Android internally calls the zero-argument constructor when recreating fragments (for example, if they are being restored after being killed for Android’s own reasons). For this reason, it is not advisable to rely on a constructor that has parameters.
To ensure that your expected fragment arguments are always present you can use a static newInstance()
method to create the fragment, and put whatever parameters you want in to a bundle that will be available when creating a new instance.
import android.os.Bundle; import android.support.v4.app.Fragment; public class MyFragment extends Fragment { // Our identifier for obtaining the name from arguments private static final String NAME_ARG = "name"; private String mName; // Required public MyFragment(){} // The static constructor. This is the only way that you should instantiate // the fragment yourself public static MyFragment newInstance(final String name) { final MyFragment myFragment = new MyFragment(); // The 1 below is an optimization, being the number of arguments that will // be added to this bundle. If you know the number of arguments you will add // to the bundle it stops additional allocations of the backing map. If // unsure, you can construct Bundle without any arguments final Bundle args = new Bundle(1); // This stores the argument as an argument in the bundle. Note that even if // the 'name' parameter is NULL then this will work, so you should consider // at this point if the parameter is mandatory and if so check for NULL and // throw an appropriate error if so args.putString(NAME_ARG, name); myFragment.setArguments(args); return myFragment; } @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Bundle arguments = getArguments(); if (arguments == null || !arguments.containsKey(NAME_ARG)) { // Set a default or error as you see fit } else { mName = arguments.getString(NAME_ARG); } } }
Now, in the Activity:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); MyFragment mFragment = MyFragment.newInstance("my name"); ft.replace(R.id.placeholder, mFragment); //R.id.placeholder is where we want to load our fragment ft.commit();
This pattern is a best practice to ensure that all the needed arguments will be passed to fragments on creation. Note that when the system destroys the fragment and re-creates it later, it will automatically restore its state - but you must provide it with an onSaveInstanceState(Bundle)
implementation.