简体   繁体   English

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()

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".但是在从 androidx.navigation:navigation-fragment:2.0.0 更新 androidx 依赖项后,2.2.0 应用程序在按下“返回”按钮后崩溃。 Crash always after return from other fragment to previous fragment containing FragmentPagerAdapter.从其他片段返回到包含 FragmentPagerAdapter 的前一个片段后总是崩溃。

in build.gradlebuild.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'
}

For see a problem and getting error, please download example from https://github.com/ABRadzh/ErrorNavigation .如需查看问题和错误,请从https://github.com/ABRadzh/ErrorNavigation下载示例。 Otherwise it will be difficult for me to explain where the error occurs.否则我很难解释错误发生在哪里。

  1. Press on any button on any page.按任何页面上的任何按钮。
  2. Press hardware "Back" button.按硬件“返回”按钮。
  3. Get error message:获取错误信息:
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)

But all code for transition fragment and data binding is generated automatically.但是所有转换片段和数据绑定的代码都是自动生成的。 I do not known where i must call removeView().我不知道我必须在哪里调用 removeView()。

If you try to use old dependencies, then invert all comments in code and layouts.如果您尝试使用旧的依赖项,请反转代码和布局中的所有注释。 And popBackStack() will work correctly.并且 popBackStack() 将正常工作。

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());
}

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.我真的建议您创建一个包含此代码的 BaseFragment 并且每个片段都将从它扩展,因此您不必在每个片段类上重复代码。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在片段中使用数据绑定时出现异常:“指定的子节点已经有父节点。你必须首先在孩子的父母上调用removeView()“ - Exception when using data binding in fragment: “The specified child already has a parent. You must call removeView() on the child's parent first” 使用导航导航到独立片段 - Navigate to a independent fragment with navigation Android数据绑定让fragment全屏显示,中断导航 - Android data binding makes fragment display full screen, breaks navigation 数据绑定和:输入字段验证和操作; 活动/片段导航 - Data Binding and: Input field validation and manipulation; Activity/Fragment Navigation 如何将 DataBinding 与 AndroidX 片段一起使用 - How to use DataBinding with AndroidX fragment 如何用 Android 数据绑定替换 androidx.fragment.app.FragmentContainerView 中的片段 - How to replace fragment in androidx.fragment.app.FragmentContainerView with Android databinding 数据绑定 - Lambda 表达式必须首先解析为其设置器才能获取类型 - Databinding - Lambda expression must be resolved to its setter first to get the type 欣赏风景的伟大的伟大祖父母观的最佳方法? - Best Way to Get the View's Great Great Grand Parent View? 导航控制器没有在按钮按下时切换片段 - Navigation Controller not Switching Fragments on Button Press 导航抽屉和android数据绑定 - Navigation Drawer and android data binding
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM