2

У меня есть Activity под названием HomeActivity, в котором используются фрагменты HomeFragment и OwnershipFragment.NullPointerException брошен в onSaveInstanceState после выхода из фрагмента

Когда я нажимаю элемент списка в HomeFragment, выполняется транзакция фрагмента и запускается OwnershipFragment.

В OwnershipFragment я следующий метод: onSaveInstanceState

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

И в 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; 

} 

В основном, приложение падает после того, как следующее:

  1. я нажимаю в элементе списка, который открывается OwnershipFragment. (отлично работает)
  2. Я нажимаю кнопку «Назад», которая начинает транзакцию, которая возвращается к HomeFragment и помещает OwnershipFragment в задний стек. (отлично работает)
  3. Я поворачиваю свой телефон, чтобы изменить ориентацию в альбомном режиме. (Работает отлично)
  4. я включаю его обратно в портрет и аварий приложений и дает NullPointerException по адресу:

для (INT I = 0; я < mDirectors.size(); я ++) // в onSaveInstanceState методе

Я не могу понять, почему, хотя, потому что я не могу найти, где mDirectors присваивается значение null. Я не уверен, что другой код, чтобы обеспечить, таким образом, просто дайте мне знать, и я положу его.

Почему onSaveInstanceState из OwnershipFragment называют в первую очередь, если текущий фрагмент отображаемая HomeFragment?

Вот мой 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) 
+0

один из этих методов возвращает null 'if (savedIns tanceState! = null) mDirectors = (ArrayList ) savedInstanceState.getSerializable (DIRECTORS); else mDirectors = mManager.getDirectors(); ' –

+0

Я поставил точку останова прямо перед этими утверждениями, а во время ошибки они не вызываются. Я не думаю, что 'onCreateView' для' OwnershipFragment' даже называется вообще, когда я меняю ориентацию 'HomeFragment' – ujvl

ответ

1

В соответствии с Вашим комментарием, изменить ваше определение mDirectors к

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

или проверить нуль в вашей по

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

Почему' onSaveInstanceState' 'OwnershipFragment' вызывается в первую очередь, если текущий фрагмент является' HomeFragment'? – ujvl

+0

Не могу сказать из кода, который вы опубликовали. –

+0

Помогло ли вам разместить код «HomeFragment» и/или код «HomeActivity»? – ujvl

Смежные вопросы