选择DatePicker后,AddFragment崩溃AddFragment被“删除”并重新添加到MainAcitivty

时间:2013-01-15 13:18:28

标签: android-fragments android-dialogfragment

我有一个包含3个片段的主要活动。

    public void getAddFragment() {  
    FragmentTransaction transaction = fragMgr.beginTransaction();
    //toggle active fragments
    hFragActive = false;
    bFragActive = false;
    aFragActive = true;

    aFragment.setRetainInstance(true);

    transaction.remove(hFragment);
    transaction.remove(bFragment);

    transaction.add(R.id.container, aFragment, TAG_TOGGLABLE_FRAG);

    transaction.commit();       
}

我可以从一个跳转到另一个,并且因为我添加/删除了字段值...我的问题是'AddFragment'上的日期字段 我可以首先启动并翻转所有选项(3个片段),如果我不改变任何东西它工作正常。如果我改变任何文本,等等仍然可以。一旦我打开了datepicker对话框(子片段)并且它更新了我的AddFragment,我就可以了,直到我离开AddFragment并返回。它崩溃了:

logcat的:

    01-14 16:20:42.068: D/ActivityLifecycle(32483): onCreate, savedInstanceState is null
01-14 16:20:42.099: D/FragmentLifecycle(32483): onAttach attach to com.example.optionfragmenttest.Main
01-14 16:20:42.099: D/FragmentLifecycle(32483): onCreate savedInstanceState is null
01-14 16:20:42.099: D/FragmentLifecycle(32483): onCreateView savedInstanceState is null
01-14 16:20:42.099: D/FragmentLifecycle(32483): savedInstanceState is NULL
01-14 16:20:42.099: D/FragmentLifecycle(32483): onActivityCreated savedInstanceState is null
01-14 16:20:42.099: D/FragmentLifecycle(32483): onStart
01-14 16:20:42.107: D/ActivityLifecycle(32483): onStart
01-14 16:20:42.107: D/ActivityLifecycle(32483): onResume
01-14 16:20:42.107: D/FragmentLifecycle(32483): onResume
01-14 16:20:42.115: D/FragmentLifecycle(32483): onPause
01-14 16:20:42.115: D/ActivityLifecycle(32483): onPause
01-14 16:20:42.139: D/libEGL(32483): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
01-14 16:20:42.139: D/libEGL(32483): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
01-14 16:20:42.154: D/libEGL(32483): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
01-14 16:20:42.224: D/OpenGLRenderer(32483): Enabling debug mode 0
01-14 16:20:42.232: D/FragmentLifecycle(32483): onSaveInstanceState
01-14 16:20:42.232: D/ActivityLifecycle(32483): onSaveInstanceState
01-14 16:20:42.232: D/FragmentLifecycle(32483): onStop
01-14 16:20:42.232: D/ActivityLifecycle(32483): onStop
01-14 16:20:42.240: D/onCreateOptionsMenu(32483): onCreateOptionsMenu, menu is not null
01-14 16:20:42.435: D/FragmentLifecycle(32483): onStart
01-14 16:20:42.435: D/ActivityLifecycle(32483): onStart
01-14 16:20:42.521: D/ActivityLifecycle(32483): onResume
01-14 16:20:42.521: D/FragmentLifecycle(32483): onResume
01-14 16:20:49.428: D/FragmentLifecycle(32483): onPause
01-14 16:20:49.428: D/FragmentLifecycle(32483): onStop
01-14 16:20:49.428: D/FragmentLifecycle(32483): onDestroyView
01-14 16:20:49.428: D/FragmentLifecycle(32483): onDestroy
01-14 16:20:49.428: D/FragmentLifecycle(32483): onDetach
01-14 16:20:49.428: D/AddFragment(32483): onAttach attach to com.example.optionfragmenttest.Main
01-14 16:20:49.428: D/AddFragment(32483): onCreate savedInstanceState is null
01-14 16:20:49.428: D/AddFragment(32483): onCreateView savedInstanceState is null
01-14 16:20:49.467: D/dalvikvm(32483): GC_FOR_ALLOC freed 135K, 2% free 10969K/11143K, paused 18ms, total 19ms
01-14 16:20:49.490: D/AddFragment(32483): savedInstanceState is NULL
01-14 16:20:49.514: D/AddFragment(32483): onActivityCreated savedInstanceState is null
01-14 16:20:49.537: D/AddFragment(32483): Calendar instance
01-14 16:20:49.537: D/AddFragment(32483): post-OnClicListener
01-14 16:20:49.537: D/AddFragment(32483): onStart
01-14 16:20:49.537: D/AddFragment(32483): onResume
01-14 16:20:51.146: D/AddFragment(32483): datepicker touched
01-14 16:20:51.217: D/dalvikvm(32483): GC_CONCURRENT freed 100K, 2% free 11284K/11463K, paused 14ms+13ms, total 44ms
01-14 16:20:53.779: D/DateDialogFragment(32483): OnDateSet
01-14 16:20:53.810: D/DateDialogFragment(32483): OnDateSet
01-14 16:20:55.646: D/AddFragment(32483): onPause
01-14 16:20:55.646: D/AddFragment(32483): onDestroyView
01-14 16:20:55.654: D/AddFragment(32483): onDestroy
01-14 16:20:55.654: D/AddFragment(32483): onDetach
01-14 16:20:55.654: D/FragmentLifecycle(32483): onAttach attach to com.example.optionfragmenttest.Main
01-14 16:20:55.654: D/FragmentLifecycle(32483): onCreate savedInstanceState is null
01-14 16:20:55.654: D/FragmentLifecycle(32483): onCreateView savedInstanceState is null
01-14 16:20:55.662: D/FragmentLifecycle(32483): savedInstanceState is NULL
01-14 16:20:55.662: D/FragmentLifecycle(32483): onActivityCreated savedInstanceState is null
01-14 16:20:55.662: D/FragmentLifecycle(32483): onStart
01-14 16:20:55.662: D/FragmentLifecycle(32483): onResume
01-14 16:20:56.693: D/FragmentLifecycle(32483): onPause
01-14 16:20:56.693: D/FragmentLifecycle(32483): onStop
01-14 16:20:56.693: D/FragmentLifecycle(32483): onDestroyView
01-14 16:20:56.693: D/FragmentLifecycle(32483): onDestroy
01-14 16:20:56.693: D/FragmentLifecycle(32483): onDetach
01-14 16:20:56.693: D/AddFragment(32483): onAttach attach to com.example.optionfragmenttest.Main
01-14 16:20:56.693: D/AddFragment(32483): onCreate savedInstanceState is null
01-14 16:20:56.693: D/AddFragment(32483): onCreateView savedInstanceState is null
01-14 16:20:56.732: D/AddFragment(32483): savedInstanceState is NULL
01-14 16:20:56.873: D/AddFragment(32483): onActivityCreated savedInstanceState is null
01-14 16:20:56.881: D/AddFragment(32483): Calendar instance
01-14 16:20:56.889: D/AddFragment(32483): post-OnClicListener
01-14 16:20:56.889: D/AndroidRuntime(32483): Shutting down VM
01-14 16:20:56.889: W/dalvikvm(32483): threadid=1: thread exiting with uncaught exception (group=0x40f36300)
01-14 16:20:56.889: E/AndroidRuntime(32483): FATAL EXCEPTION: main
01-14 16:20:56.889: E/AndroidRuntime(32483): java.lang.IllegalStateException: No activity
01-14 16:20:56.889: E/AndroidRuntime(32483):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1075)
01-14 16:20:56.889: E/AndroidRuntime(32483):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1070)
01-14 16:20:56.889: E/AndroidRuntime(32483):    at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1861)
01-14 16:20:56.889: E/AndroidRuntime(32483):    at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1474)
01-14 16:20:56.889: E/AndroidRuntime(32483):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931)
01-14 16:20:56.889: E/AndroidRuntime(32483):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
01-14 16:20:56.889: E/AndroidRuntime(32483):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
01-14 16:20:56.889: E/AndroidRuntime(32483):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
01-14 16:20:56.889: E/AndroidRuntime(32483):    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
01-14 16:20:56.889: E/AndroidRuntime(32483):    at android.os.Handler.handleCallback(Handler.java:615)
01-14 16:20:56.889: E/AndroidRuntime(32483):    at android.os.Handler.dispatchMessage(Handler.java:92)
01-14 16:20:56.889: E/AndroidRuntime(32483):    at android.os.Looper.loop(Looper.java:137)
01-14 16:20:56.889: E/AndroidRuntime(32483):    at android.app.ActivityThread.main(ActivityThread.java:4745)
01-14 16:20:56.889: E/AndroidRuntime(32483):    at java.lang.reflect.Method.invokeNative(Native Method)
01-14 16:20:56.889: E/AndroidRuntime(32483):    at java.lang.reflect.Method.invoke(Method.java:511)
01-14 16:20:56.889: E/AndroidRuntime(32483):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
01-14 16:20:56.889: E/AndroidRuntime(32483):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-14 16:20:56.889: E/AndroidRuntime(32483):    at dalvik.system.NativeStart.main(Native Method)
01-14 16:20:58.435: I/Process(32483): Sending signal. PID: 32483 SIG: 9

1 个答案:

答案 0 :(得分:0)

对于任何感兴趣的人,这是我在遇到此异常时使用的解决方法:

public class CustomFragment extends Fragment {
    private static final Field sChildFragmentManagerField;
static {
    Field f = null;
    try {
        f = Fragment.class.getDeclaredField("mChildFragmentManager");
        f.setAccessible(true);
    } catch (NoSuchFieldException e) {
        Log.e(LOGTAG, "Error getting mChildFragmentManager field", e);
    }
    sChildFragmentManagerField = f;
}

@Override
public void onDetach() {
    super.onDetach();

    if (sChildFragmentManagerField != null) {
        try {
            sChildFragmentManagerField.set(this, null);
        } catch (Exception e) {
            Log.e(LOGTAG, "Error setting mChildFragmentManager field", e);
        }
    }
}

...

}