0

나는 한 조각 OwnershipFragmentonSaveInstanceState 방법으로 정의 : 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); 
} 

, 내가 이전의 단편 HomeFragment로 돌아가지만, 내 휴대 전화/변화 방향을 설정하는 경우 onSaveInstanceStateOwnershipFragment 인 경우 계속 호출됩니다. onSaveInstanceStateOwnershipFragment 요구되기 때문에

문제는 OwnershipFragment라는 onCreateView (가 다시 스택에서의로 보는)를 가진 적이 이후가 초기화되지 않았다 때문에 나는 mDirectorsnullpointerexception를 얻을 수있다.

어떻게하면 올바르게 처리 할 수 ​​있습니까?

조각 트랜잭션을 실행하는 내 액티비티에 onSaveInstanceState을 구현해야한다고 추측합니다. 그러나 그렇게 할 방법이 확실하지 않습니다.

public void displayView(int position) { 

    Fragment fragment = null; 

    switch (position) { 

    case HOME: 
     fragment = new HomeFragment(); 
     break; 

    case OWNERSHIP: 
     fragment = new OwnershipFragment(); 
     break; 

    } 
     //Replace fragment 
     FragmentTransaction ft = mManager.beginTransaction(); 
     ft.replace(R.id.home_container, fragment, FRAGMENT_TAG); 
     ft.addToBackStack(null).commit(); 
    } 
} 

을 그리고 여기 내 로그 캣입니다 :

는 방법은 HomeActivity의 조각을 대체하기 위해 호출됩니다

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

잘못된 정보를 수정할 수 있도록 내가 downvoted 된 이유가있을 수 있습니까? – ujvl

+0

이상하게 들리 겠지만, onSaveInstanceState()는 조각화가 인스턴스화되지 않은 경우 호출하지 않습니다. – VinceStyling

+0

나는 디버깅을했고 for 루프는 실제로 조각이 현재 것이 아니라는 사실에도 불구하고'NullPointerExcetion'을 얻은 곳입니다. – ujvl

답변

0

당신이 OwnershipFragment 생성했지만 창에 연결하지는? support.Fragment에서 확장 한 경우 setUserVisibleHint() 메서드를 재정 의하여 사용자가 실제로 볼 수있는 조각인지 확인할 수 있습니다.

public class OwnershipFragment extend android.support.v4.app.Fragment { 
    ... 
    @Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     super.setUserVisibleHint(isVisibleToUser); 
     if (isVisibleToUser) { 
      System.out.println("VISIBLE"); 
     } else { 
      System.out.println("GONE"); 
     } 
    } 
    ... 
} 

나는 당신이 그 방법에 따라서 당신이 OwnershipFragment를 볼 수 있지만, 실제로 생성, 그래서 디버깅, 차이의 위치에 두 번 displayView() 전화를 잘못 호출하지 않습니다하게 생각합니다.

관련 문제