androidx.navigation:navigation-fragment:2.2.0,获取“您必须先在孩子的父级上调用removeView()".在navController.popBackStack()上 [英] androidx.navigation:navigation-fragment:2.2.0, get "You must call removeView() on the child's parent first." on navController.popBackStack()

查看:1405
本文介绍了androidx.navigation:navigation-fragment:2.2.0,获取“您必须先在孩子的父级上调用removeView()".在navController.popBackStack()上的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我喜欢使用数据绑定和导航图.但是,在按返回"按钮后,更新2.2.0应用程序上的androidx.navigation:navigation-fragment:2.0.0的androidx依赖关系后,该应用程序崩溃了.从其他片段返回到包含FragmentPagerAdapter的先前片段后始终崩溃.

I like use data binding and navigation graph. But after update androidx dependencies from androidx.navigation:navigation-fragment:2.0.0 on 2.2.0 application is crashed after press button "Back". Crash always after return from other fragment to previous fragment containing FragmentPagerAdapter.

build.gradle

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'

//    This is work
//    implementation 'androidx.appcompat:appcompat:1.0.2'
//    implementation 'androidx.navigation:navigation-fragment:2.0.0'

//  This generate error after backstack
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.navigation:navigation-fragment:2.2.0'
}

要查看问题并获取错误,请从 https://github.com/ABRadzh/ErrorNavigation下载示例.否则,我将很难解释错误发生的位置.

For see a problem and getting error, please download example from https://github.com/ABRadzh/ErrorNavigation. Otherwise it will be difficult for me to explain where the error occurs.

  1. 按任意页面上的任何按钮.
  2. 按下硬件的后退"按钮.
  3. 获取错误消息:

2020-02-11 16:15:13.119 2429-2429/in.pagerview.navigation.databinding.onbackstack E/AndroidRuntime: FATAL EXCEPTION: main
    Process: in.pagerview.navigation.databinding.onbackstack, PID: 2429
    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:4954)
        at android.view.ViewGroup.addView(ViewGroup.java:4785)
        at androidx.viewpager.widget.ViewPager.addView(ViewPager.java:1485)
        at android.view.ViewGroup.addView(ViewGroup.java:4725)
        at android.view.ViewGroup.addView(ViewGroup.java:4698)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:326)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
        at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2625)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2577)
        at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2722)
        at androidx.fragment.app.FragmentStateManager.activityCreated(FragmentStateManager.java:346)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1188)
        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:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6719)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:449)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

但是用于过渡片段和数据绑定的所有代码都是自动生成的.我不知道必须在哪里调用removeView().

But all code for transition fragment and data binding is generated automatically. I do not known where i must call removeView().

如果尝试使用旧的依赖项,则将代码和布局中的所有注释反转.并且popBackStack()将正常工作.

If you try to use old dependencies, then invert all comments in code and layouts. And popBackStack() will work correctly.

我没有发现有关此错误的任何信息.可能是,我做错了什么?

I do not found anything about this error. May be, I do something incorrect?

推荐答案

解决方案是将这段代码添加到每个片段中:

The solution is just to add this code to every fragment:

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

我真的建议您创建一个包含以下代码的BaseFragment,每个片段都将从中扩展,因此您不必在每个片段类上重复该代码.

I really recommend you to create a BaseFragment which has this code and every fragment will extends from it, so you will not have to repeat the code on every fragment class.

这篇关于androidx.navigation:navigation-fragment:2.2.0,获取“您必须先在孩子的父级上调用removeView()".在navController.popBackStack()上的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆