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

我喜歡使用數據綁定和導航圖。 但是在從 androidx.navigation:navigation-fragment:2.0.0 更新 androidx 依賴項后,2.2.0 應用程序在按下“返回”按鈕后崩潰。 從其他片段返回到包含 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下載示例。 否則我很難解釋錯誤發生在哪里。

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

如果您嘗試使用舊的依賴項,請反轉代碼和布局中的所有注釋。 並且 popBackStack() 將正常工作。

我沒有發現有關此錯誤的任何信息。 可能是,我做錯了什么?

解決方案只是將此代碼添加到每個片段中:

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

我真的建議您創建一個包含此代碼的 BaseFragment 並且每個片段都將從它擴展,因此您不必在每個片段類上重復代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM