如何制作片段以免在按回时重新创建内容

时间:2019-09-18 08:24:28

标签: android android-fragments

起初请原谅我的英语不好。

我不希望我的片段在按回时重新创建。

我正在使用android导航组件,无法访问交易方法。

我这样做:

contentView存储在片段内部,如果不为null,则从onCreateView返回。或者从“ onCreateView”返回新视图,然后contentView在其上存储引用

运行。序列下一个片段-上一个片段。例外。

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:5050)
        at android.view.ViewGroup.addView(ViewGroup.java:4881)
        at android.view.ViewGroup.addView(ViewGroup.java:4821)
        at android.view.ViewGroup.addView(ViewGroup.java:4794)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1328)
        at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2515)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2290)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2246)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2143)
        at androidx.fragment.app.FragmentManager$3.run(FragmentManager.java:417)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6940)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

它不在项目代码中抛出,但是很容易发现我们的观点是原因(调试器+日志)

后来我制作了方法prepareView

private fun prepareView(view: View?): View? =
    (view?.parent as? ViewGroup)?.removeView(view).let { view }

要包装onCreateView中的返回内容-并开始工作,但完全没有。嗯在onDestroyView中使用contentView来称呼这个有趣-现在可以使用了!

但是有复制的情况。打开下一个片段,然后快退。然后我再一次看到此堆栈跟踪。

如果我正确理解,在contentView尝试附加操作时,动作将在其他线程中运行,而removeView尚未完成。

有人知道如何处理吗?

0 个答案:

没有答案