FragmentManager - IllegalStateException - 没有主机

时间:2015-10-19 09:10:22

标签: android android-fragments

我在这个堆栈跟踪中遇到了一个非常奇怪的问题:

Fatal Exception: java.lang.IllegalStateException No host
    android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1194)
    android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1189)
    android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated (FragmentManager.java:2001)
    android.support.v4.app.Fragment.performActivityCreated (Fragment.java:1976)
    android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1051)
    android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1207)
    android.support.v4.app.BackStackRecord.run (BackStackRecord.java:738)
    android.support.v4.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:1572)
    android.support.v4.app.FragmentManagerImpl$1.run (FragmentManager.java:493)
    android.os.Handler.handleCallback (Handler.java:733)
    android.os.Handler.dispatchMessage (Handler.java:95)
    android.os.Looper.loop (Looper.java:146)
    android.app.ActivityThread.main (ActivityThread.java:5593)
    java.lang.reflect.Method.invokeNative (Method.java)
    java.lang.reflect.Method.invoke (Method.java:515)
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1283)
    com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1099)
    dalvik.system.NativeStart.main (NativeStart.java)

我在多个Android版本(4.1.2,4.2.2,6.0)上跟踪了4次崩溃。我使用了很多Fragments,这意味着我无法弄清楚究竟会抛出异常的位置。

FragmentManager代码:

void moveToState(int newState, int transit, int transitStyle, boolean always) {
    if (mHost == null && newState != Fragment.INITIALIZING) {
        throw new IllegalStateException("No host");
    }
    ...
}

在我看来,如果没有归属Activity属于Fragment,就会发生这种情况。我调用了ve read this exception is sometimes thrown when setRetainInstance()`,但我根本不使用它。

感谢您的每一条建议。

3 个答案:

答案 0 :(得分:3)

如果您嵌套了Fragment(其父级Activity扩展了FragmentActivity),则使用getChildFragmentManager()代替getFragmentManager()

您也可以使用getSupportFragmentManager()

修改 如果此Fragment是另一个Fragment的子节点,则此处返回的FragmentManager将是父节点getChildFragmentManager()

注意: 返回此片段的宿主对象。如果当前未托管片段,则可以返回null。看到 http://developer.android.com/reference/android/app/Fragment.html#getHost()

答案 1 :(得分:1)

我不确定你为什么会收到这个错误。当我重复使用Fragments而不是调用

时,我收到了这个错误
    fragmentManager.executePendingTransactions()

答案 2 :(得分:0)

我遇到了同样的问题,这似乎是相关的问题:https://code.google.com/p/android/issues/detail?id=42601。在以前版本的support v4库中,例外是java.lang.IllegalStateException: No activity

我尝试了#10的解决方法,但它对我没用。