起初请原谅我的英语不好。
我不希望我的片段在按回时重新创建。
我正在使用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尚未完成。
有人知道如何处理吗?