FragmentManager IllegalStateException:没有主机

Posted

技术标签:

【中文标题】FragmentManager IllegalStateException:没有主机【英文标题】:FragmentManager IllegalStateException: No host 【发布时间】:2016-12-29 06:11:35 【问题描述】:

更新: 当我尽可能地放置 nullcheks (fragment != null, getActivity() != null) 时,崩溃消失了。

我的应用正在使用 ViewPager(屏幕外限制 5),并使用 getSupportFragmentManager() 初始化了 FragmentStatePagerAdapter。每个页面都有自己的片段和回栈。

应用程序在启动时崩溃。问题仅出现在 preLollipop 设备和模拟器上。使用最新的支持库(也尝试了 24.0.0 - 结果相同) 堆栈跟踪:

java.lang.IllegalStateException: 没有主机 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1273) 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1268) 在 android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:2138) 在 android.support.v4.app.Fragment.onCreate(Fragment.java:1254) 在 android.support.v4.app.Fragment.performCreate(Fragment.java:2062) 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1051) 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1286) 在 android.support.v4.app.BackStackRecord.run(BackStackRecord.java:758) 在 android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1632) 在 android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:637) 在 android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:166) 在 android.support.v4.view.ViewPager.populate(ViewPager.java:1237) 在 android.support.v4.view.ViewPager.populate(ViewPager.java:1085) 在 android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1611) 在 android.view.View.measure(View.java:16497) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 在 android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 在 android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 在 android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 在 android.view.View.measure(View.java:16497) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 在 android.view.View.measure(View.java:16497) 在 android.widget.RelativeLayout.measureChildHorizo​​ntal(RelativeLayout.java:719) 在 android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455) 在 android.view.View.measure(View.java:16497) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 在 android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135) 在 android.view.View.measure(View.java:16497) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 在 android.view.View.measure(View.java:16497) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 在 android.view.View.measure(View.java:16497) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 在 android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 在 android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 在 android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 在 android.view.View.measure(View.java:16497) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 在 com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291) 在 android.view.View.measure(View.java:16497) 在 android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1912) 在 android.view.ViewRootImpl.measureHierarchy (ViewRootImpl.java:1109) 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1291) 在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996) 在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 在 android.view.Choreographer.doCallbacks(Choreographer.java:574) 在 android.view.Choreographer.doFrame(Choreographer.java:544) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 在 android.os.Handler.handleCallback(Handler.java:733) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:136)

【问题讨论】:

你能给我们看一些代码吗? @AbdulAhad 总共有太多关于事务和片段的代码 - 所以我不知道要发布什么代码(从堆栈跟踪中不清楚问题出在哪里)。 你可以看看这个***.com/questions/33210617/… 在调用setCurrentItem(()之前检查getActivity()是否为空 你在哪里打电话给setCurrentItem?可以加这个代码块吗? 【参考方案1】:

如果您有嵌套的 Fragment(扩展 FragmentActivity),则使用 getChildFragmentManager() 而不是 getFragmentManager()。

也许它会帮助你..

【讨论】:

【参考方案2】:

就我而言,我在片段内使用 viewpager,并在设置 viewpager 适配器时使用getChildFragmentManager()。我猜也建议使用它。

还有一个问题,java.lang.IllegalStateException: No host 异常不是每次都显示,但是当我调用包含 Activity 的 viewpager 方法或在设置 viewpager.setCurrentItem(POSITION); 之前从另一个 Activity 类返回时,它显示得太频繁了

我尝试了很多方法,最后我将getChildFragmentManager()改为getActivity().getSupportFragmentManager();

更改此java.lang.IllegalStateException: No host 后不再显示异常。

我认为它与包含 viewpager 的 Activity 状态问题有关。

【讨论】:

【参考方案3】:

当您使用 viewPager 时,请确保您遵循这些做法

    在您的构造函数中调用 super(fragmentManager) 如果您在 Fragment 中使用 Viewpager,请将 getChildFragmentManager 传递给 Adapter

【讨论】:

以上是关于FragmentManager IllegalStateException:没有主机的主要内容,如果未能解决你的问题,请参考以下文章

无法从 android.app.FragmentManager 转换为 android.support.v4.app.FragmentManager

android.support.v4.app.FragmentManager无法转换为android.app.FragmentManager

在 FragmentManager 中管理 BackStackEntries

从 Fragment (support.v4) 中获取 FragmentManager [重复]

FragmentManager 和 FragmentTransaction 到底是做啥的?

使用 (Child)FragmentManager 正确使用子子片段