如何在转换中期处理片段中的后退按钮?

时间:2015-08-17 13:12:56

标签: android android-fragments

所以我有一个案例,如果我在转换动画运行时调用popBackStack,应用程序崩溃了。是否有任何干净的方法来阻止任何正在进行的过渡,或者至少检查是否有人在运行?

我得到的例外:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
        at android.view.ViewGroup.addViewInner(ViewGroup.java:3577)

可能会或可能与此异常发生原因相关的几个事实:

  • 我使用标准的Fragment实现,而不是supportFragment(原因是我想使用SettingsFragment)。
  • 我在片段上使用setRetainInstance(true)
  • 我确实尝试从片段onCreateView中的父级删除子视图,但由于某种原因(childView.getParent()在调用parentView.remove(childView)后仍未为空)失败

我考虑过的解决方案:

  1. 设置retainInstance=false
  2. 在执行popBackStack
  3. 之前等到animation ends
  4. 找到一种干净地中止/逆转过渡的方法
  5. no.1并不是一个真正的选择,因为它会破坏用户的用户体验并导致大量的重构。

    no.2是我现在考虑最多的那个,但我不喜欢如何移动与动画初始化相关的代码并为此解决方案实现一堆代码

    no.3如果我知道如何,我会选择解决方案吗?任何人吗?

1 个答案:

答案 0 :(得分:0)

您需要将其缓存视图与其父视图分离:

@Override
    public void onDestroyView() {
        if (view != null) {
            ViewGroup parent = (ViewGroup) view.getParent();
            if (parent != null)
                parent.removeView(view);
        }
        super.onDestroyView();
    }