快速向后导航抛出 指定的子项已具有父项.您必须调用 removeView()



我导航到一个片段,当我按下列表中的元素并快速按回时,我收到此错误,我不知道确切的行,因为它没有告诉我它发生在哪里,但我怀疑在我的 onCreateView 中

我的代码

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
if (rootView == null) {
rootView = inflater.inflate(R.layout.landing_fragment, container, false)
fetchShops(location)
setupRecyclerView(rootView!!)
}
return rootView
}

private fun setupRecyclerView(rootView: View) {
rootView.landing_rv.layoutManager = LinearLayoutManager(requireContext())
rootView.landing_rv.addItemDecoration(
DividerItemDecoration(
requireActivity(),
LinearLayoutManager.VERTICAL
)
)
rootView.landing_rv.adapter = landingAdapter
}

日志猫抛出的错误只是

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:5038)
at android.view.ViewGroup.addView(ViewGroup.java:4869)
at androidx.fragment.app.FragmentContainerView.addView(FragmentContainerView.java:280)
at android.view.ViewGroup.addView(ViewGroup.java:4809)
at android.view.ViewGroup.addView(ViewGroup.java:4782)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:326)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:201)
at android.app.ActivityThread.main(ActivityThread.java:6806)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)

我对 rootview 使用上述检查,因为我只创建了该片段的一个实例来防止我的 viewModel (fetchShops( 触发两次

你是如何生成你的片段的? 您可以尝试将片段添加到后退堆栈,并在父活动中处理一些自定义后退按钮。 这样,片段的onCreate只会在添加时被调用一次。 然后在您的片段中,将fetchShops(location)的东西移动到onCreate. 下面是一个最小示例:

// MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
supportFragmentManager.beginTransaction().apply {
add(R.id.frag_container, FragA())
commit()
}
override fun onBackPressed() {
val fragCount = supportFragmentManager.backStackEntryCount
if (fragCount == 0) {
super.onBackPressed()
}
else {
supportFragmentManager.popBackStack()
}
}
// FragA.kt
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
fetchShops(location)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_fraga, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
next_btn.setOnClickListener {
// Go to frag B.
requireActivity().supportFragmentManager.beginTransaction().apply {
replace(R.id.frag_container, FragB())
addToBackStack(null)
commit()
}
}
}

希望这有帮助!

相关内容

最新更新