u3l
u3l

Reputation: 3412

NullPointerException thrown in onSaveInstanceState after exiting Fragment

I have an Activity called HomeActivity, which uses fragments HomeFragment and OwnershipFragment.

When I click a listview item in HomeFragment, a fragment transaction is carried out and OwnershipFragment is started.

In OwnershipFragment I have the following onSaveInstanceState method:

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    for(int i = 0; i <mDirectors.size(); i++)
        mDirectors.get(i).updateFromForm();

    outState.putSerializable(DIRECTORS, mDirectors);
}

And in onCreateView...

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    final View rootView = inflater.inflate(R.layout.fragment_ownership, container, false);
    mFormContainer = (LinearLayout) rootView.findViewById(R.id.ownership_form_container);

    mManager = new SessionManager(getActivity());
    mDirectors = new ArrayList<Director>();

    if (savedInstanceState != null)
        mDirectors = (ArrayList<Director>) savedInstanceState.getSerializable(DIRECTORS);
    else
        mDirectors = mManager.getDirectors();

    //Other stuff

    return rootView;

}

Basically, the app crashes after the following:

  1. I click on the listview item that opens OwnershipFragment. (works fine)
  2. I press the back button, which starts a transaction that goes back to HomeFragment and puts OwnershipFragment on the back stack. (works fine)
  3. I turn my phone to change orientation to landscape mode. (works fine)
  4. I turn it back to portrait and the app crashes and gives a NullPointerException at:

for(int i = 0; i < mDirectors.size(); i++) //in the onSaveInstanceState method

I can't figure out why though because I can't find where mDirectors is assigned a null value. I'm not sure what other code to provide, so just let me know and i'll put it in.

Why is onSaveInstanceState of OwnershipFragment called in the first place if the current fragment displayed is HomeFragment?

Here's my Logcat:

07-15 11:28:24.440: E/AndroidRuntime(12150): FATAL EXCEPTION: main
07-15 11:28:24.440: E/AndroidRuntime(12150): java.lang.NullPointerException
07-15 11:28:24.440: E/AndroidRuntime(12150):    at com.opendoors.core.OwnershipFragment.onSaveInstanceState(OwnershipFragment.java:204)
07-15 11:28:24.440: E/AndroidRuntime(12150):    at android.app.Fragment.performSaveInstanceState(Fragment.java:1840)
07-15 11:28:24.440: E/AndroidRuntime(12150):    at android.app.FragmentManagerImpl.saveFragmentBasicState(FragmentManager.java:1598)
07-15 11:28:24.440: E/AndroidRuntime(12150):    at android.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1655)
07-15 11:28:24.440: E/AndroidRuntime(12150):    at android.app.Activity.onSaveInstanceState(Activity.java:1233)
07-15 11:28:24.440: E/AndroidRuntime(12150):    at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:546)
07-15 11:28:24.440: E/AndroidRuntime(12150):    at com.opendoors.core.HomeActivity.onSaveInstanceState(HomeActivity.java:220)
07-15 11:28:24.440: E/AndroidRuntime(12150):    at android.app.Activity.performSaveInstanceState(Activity.java:1181)
07-15 11:28:24.440: E/AndroidRuntime(12150):    at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1233)
07-15 11:28:24.440: E/AndroidRuntime(12150):    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3778)
07-15 11:28:24.440: E/AndroidRuntime(12150):    at android.app.ActivityThread.access$800(ActivityThread.java:152)
07-15 11:28:24.440: E/AndroidRuntime(12150):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1288)
07-15 11:28:24.440: E/AndroidRuntime(12150):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-15 11:28:24.440: E/AndroidRuntime(12150):    at android.os.Looper.loop(Looper.java:137)
07-15 11:28:24.440: E/AndroidRuntime(12150):    at android.app.ActivityThread.main(ActivityThread.java:5328)
07-15 11:28:24.440: E/AndroidRuntime(12150):    at java.lang.reflect.Method.invokeNative(Native Method)
07-15 11:28:24.440: E/AndroidRuntime(12150):    at java.lang.reflect.Method.invoke(Method.java:511)
07-15 11:28:24.440: E/AndroidRuntime(12150):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
07-15 11:28:24.440: E/AndroidRuntime(12150):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
07-15 11:28:24.440: E/AndroidRuntime(12150):    at dalvik.system.NativeStart.main(Native Method)

Upvotes: 2

Views: 759

Answers (1)

Scary Wombat
Scary Wombat

Reputation: 44844

As per your comment, change you definition of mDirectors to

ArrayList<Director> mDirectors = new ArrayList<Director>();

or check for null in your for as

for(int i = 0; mDirectors != null && i < mDirectors.size(); i++)

Upvotes: 1

Related Questions