切换Fragment过快会导致:java.lang.IllegalStateException: No activity

5

我没有使用ViewPager,也只在活动布局中的导航栏上的按钮点击时调用任何Fragment事务。

当我太快地切换到片段(如前后),我会遇到以下异常:

java.lang.IllegalStateException: No activity

似乎是在第一个没有完全加载完成的Fragment上点击以切换到另一个Fragment时发生的。我正在使用FragmentActivity

有谁能解决这个问题吗?

我的代码用于切换Fragment

fragmentManager.beginTransaction()
    .replace(R.id.container, old,
        fragment.getClass().getSimpleName())
    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN).commit();

编辑:去掉转换效果解决了问题,但我想知道是否有一种方法可以在保留转换效果的情况下解决这个问题。我的理论是,转换会延迟片段的生命周期,并在启动另一个片段事务时导致活动为空。


@shkschneider 我已经调查过了。显然这是新支持库中的一个错误,但我在这里没有使用子片段管理器。这仅仅是一个基本应用程序,通过活动中的按钮可以访问4个屏幕。 - sihrc
我认为你的问题与获取 onAttach 上下文有关,你尝试过后来获取上下文吗?例如在 onActivityCreated 中。 - Rarw
我从片段的onAttach回调中获取我的活动引用。这发生在片段甚至被添加之前。异常由片段管理器抛出。 - sihrc
@sihrc 如果那是一个支持库的 bug,那就很糟糕了。你有任何支持你的假设的链接吗? - shkschneider
这里也有同样的问题,没有子片段,只是添加和删除带有转换的片段会触发快速的切换:java.lang.IllegalStateException: No host你找到解决方案了吗? - gmazzo
显示剩余3条评论
1个回答

4
今天我遇到了同样的问题。原来是我正在缓存我的片段(这是完全有效的),但我在删除/添加它时还太快了(当仍在动画时)。
在调用 .replace(R.id.container, old) 之前,请尝试检查: old.isRemoving()
如果返回 true,则表示该片段仍在使用中,并重新添加它会触发该问题。在这种情况下,您应该创建一个新的片段实例。
我猜测是我在尝试重新添加一个片段时,它仍在动画其删除过程中,因此需要两个片段实例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接