2014-01-15 4 views
1

여러 자식 조각이있는 조각이 있습니다. 나는 다음과 같은 코드로 부모 레이아웃에서 자식 조각을 배치 :사용되지 않음 장치 순환 후 하위 조각의 활동 참조

public override View OnCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    ... 

    var transaction = ChildFragmentManager.BeginTransaction(); 
    if (ChildFrag == null) { 
     var childFragment = new ChildFragment(); 
     transaction.Replace (Resource.Id.child_fragment_container, childFragment, ChildFragment.FragmentTag); 
    } 
    ... place other fragments 

    transaction.Commit(); 
} 

ChildFragment ChildFrag { 
    get { 
     return ChildFragmentManager.FindFragmentByTag (ChildFragment.FragmentTag) as ChildFragment; 
    } 
} 

장치 회전 한 후, (나는 부모 조각이 새로 생성 된 활동에 대한 참조를 가지고 있음을 알 수 있지만, 아이 조각은 여전히 ​​이전을 참조 사전 회전) 활동 인스턴스. 구성 변경 후 조각 트랜잭션을 수행하려고하면이 문제가 발생합니다. 예를 들어, 대화 상자를 시작하면 다음과 같은 오류가 발생합니다.

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1327) 
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1338) 
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595) 
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574) 
at android.support.v4.app.DialogFragment.show(DialogFragment.java:127) 
at myapp.myviews.SpinnerRow.n_onClick(Native Method) 
at myapp.myviews.SpinnerRow.onClick(SpinnerRow.java:68) 
at android.view.View.performClick(View.java:4475) 
at android.view.View$PerformClick.run(View.java:18786) 
at android.os.Handler.handleCallback(Handler.java:730) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:5419) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:525) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 
at dalvik.system.NativeStart.main(Native Method) 

하위 조각이 사용되지 않는 활동을 참조하게되는 원인은 무엇입니까?

this post에서 제공되는 솔루션은 단순히 부모 단편을 보유하지 않는 것입니다. 조각을 유지해야합니다.

답변

1

분명히 이것은 Android 프레임 워크가 작동하는 방식입니다. 부모 단편에서 RetainInstance가 true로 설정된 경우 하위 단편은 순환 게재를 통해 단순히 도매로 유지됩니다. 활동 참조는 하위 조각에서 결코 업데이트되지 않습니다.

나는 이것이 MonoDroid뿐만 아니라 Android (Java)에서 동일하게 작동 함을 확인했습니다.

용액 상위 단편에 거짓 RetainInstance 설정하고 OnSaveInstancestate() 또는 FragmentManager.SaveFragmentInstanceState 및 Fragment.SetInitialSavedState()의 조합을 이용하여 회전을 통해 상태 보존을 보장하는`

0

I've을위한 간단한 방법을 발견 이 문제는 중첩 된 단편에서 이전 활동에 대한 참조를 올바르게 유지하지만 부모 단편은 그렇지 않으므로 previos 대신 실제 활동을 참조하기 위해 getParentFragment.getActivity()를 호출하는 것이 가장 좋습니다. .

+0

예. 이것은 또한 작동합니다. 자식 조각이 부모 조각에 있는지 여부를 알 필요가 있기 때문에 때때로 디자인을 복잡하게 만들 수 있습니다. – joates