IllegalStateException в NavigationComponent - PullRequest
       72

IllegalStateException в NavigationComponent

0 голосов
/ 22 сентября 2019

Я использую компонент навигации от Jetpack в моем приложении.У меня есть 2 фрагмента, например FirstFragment и SecondFragment, и у меня есть навигация в графе навигации от первого до второго.Так все работает правильно.Я хочу добавить дочерний фрагмент в FirstFragment.Поэтому в методе onCreateView класса FirstFragment я добавил строку

getChildFragmentManager().beginTransaction().add(R.id.fragment_container, new SimpleFragment()).commit();

Таким образом, у меня есть внутренний фрагмент в FirstFragment.Навигация по SecondFragment из FirstFragment все еще работает правильно, но когда я нажимаю кнопку «Назад» во SecondFragment, я получаю эту ошибку

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.abc.def, PID: 28856
    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:4937)
        at android.view.ViewGroup.addView(ViewGroup.java:4768)
        at android.view.ViewGroup.addView(ViewGroup.java:4708)
        at android.view.ViewGroup.addView(ViewGroup.java:4681)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1353)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1642)
        at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1736)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1800)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3096)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:3050)
        at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2688)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1369)
        at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2633)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2377)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2333)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2230)
        at androidx.fragment.app.FragmentManager$3.run(FragmentManager.java:414)
        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:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

Я получаю эту ошибку, если я нажимаю кнопку «Назад» или вызываю navController.navigateUp() или navController.popBackStack().Если я удалю строку

getChildFragmentManager().beginTransaction().add(R.id.fragment_container, new SimpleFragment()).commit();

из FirstFragment, у меня не будет ошибки, так что это означает, что есть проблема с дочерним менеджером фрагментов, верно?Что здесь не так?

Ответы [ 2 ]

0 голосов
/ 22 сентября 2019

Проблема была в SimpleFragment.Я сохранял ссылку на корневой вид этого фрагмента (имел поле View mRootView) и не создавал его заново, если он не был нулевым.

0 голосов
/ 22 сентября 2019

Если я правильно понимаю, не зная, что у вас есть, не глядя на ваш макет "fragment_container", то мне будет сказано, что его тип ViewGroup, который может иметь только одного ребенка на данный момент, если вы не предоставите больше информации

Это означает, что у fragment_container уже есть ребенок, и вы должны удалить его, прежде чем добавить SimpleFragment.

Предположим, у вас есть ваш первый макет фрагмента примерно такой

<someView>

  <fragment_container/>  // hear you are loading your first fragment and trying load the SimpleFragment as well which is causing problem.

</someView>

, что вам нужно

<someView>

  <fragment_container/>  only load First Fragment "first_fragment_layout.xml"

</someView>

И в макете первого фрагмента

first_fragment_layout.xml

<someView>

  <viewBlasBla/>

  <viewBlasBla/>

  <fragment_container/>  load SimpleFragment here

</someView>

Как вы можете видеть, вы действительно пытаетесь создать вложенный фрагмент, что не является хорошей практикой.постарайтесь избежать этого, если это возможно:).

вы можете связаться со мной здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...