У меня проблема с компонентом архитектуры навигации Android, когда я пытаюсь перейти от одного фрагмента к другому в окне просмотра, я получаю эту ошибку:

java.lang.IllegalArgumentException: Navigation action/destination 
com.gigaweb.mysales:id/action_mainFragment_to_addTransactionFragment cannot be found from the current 
destination Destination(com.gigaweb.mysales:id/pagerFragment) label=fragment_pager class=com.gigaweb.mysales.PagerFragment

У меня есть окно просмотра, которое я использую для навигации между двумя фрагментами, и он отлично работает. проблема в том, что у меня есть кнопка в одном из фрагментов, кнопка также используется для перехода к другому фрагменту с помощью navcontroller, и при нажатии кнопки приложение вылетает, и я получаю указанную выше ошибку.

Below is the screenshot of the error

Обновление . Это navGraph

Как вы можете видеть, фрагмент входа в систему является начальным пунктом назначения, и есть действие, которое нравится ему в фрагменте пейджера, который служит хостом для ViewPager.

Как я хочу, чтобы приложение работало:

  1. Когда приложение запускается, отображается фрагмент входа ..... работает

  2. Перейдите к PagerFragment при нажатии кнопки входа ..... работает

  3. Перемещайтесь между MainFragment и AdminFragment, проводя пальцем влево или вправо ..... работа

  4. Перейдите к фрагменту AddTransaction при нажатии кнопки FAB ..... НЕ РАБОТАЕТ !! при нажатии кнопки происходит сбой приложения.

Обновить Вот XML-код для навигационного графика.

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/signInFragment">

<fragment
    android:id="@+id/signInFragment"
    android:name="com.gigaweb.mysales.SignInFragment"
    android:label="fragment_sign_in"
    tools:layout="@layout/fragment_sign_in" >
    <action
        android:id="@+id/action_signInFragment_to_pagerFragment"
        app:destination="@id/pagerFragment" />
</fragment>
<fragment
    android:id="@+id/addTransactionFragment"
    android:name="com.gigaweb.mysales.AddTransactionFragment"
    android:label="AddTransactionFragment" >
    <action
        android:id="@+id/action_addTransactionFragment_to_mainFragment"
        app:destination="@id/mainFragment" />
</fragment>
<fragment
    android:id="@+id/mainFragment"
    android:name="com.gigaweb.mysales.MainFragment"
    android:label="MainFragment" >
    <action
        android:id="@+id/action_mainFragment_to_addTransactionFragment"
        app:destination="@id/addTransactionFragment" />
</fragment>
<fragment
    android:id="@+id/adminFragment"
    android:name="com.gigaweb.mysales.AdminFragment"
    android:label="AdminFragment" />
<fragment
    android:id="@+id/pagerFragment"
    android:name="com.gigaweb.mysales.PagerFragment"
    android:label="fragment_pager"
    tools:layout="@layout/fragment_pager" />
</navigation>

enter image description here

3
afhamu 23 Сен 2020 в 17:45

2 ответа

Лучший ответ

Если вы не сделаете navigate() в MainFragment и AdminFragment, вы останетесь в последнем пункте назначения, к которому вы направлялись: PagerFragment, это ожидаемое поведение. NavController ничего не знает о дочерних фрагментах, таких как фрагменты в ViewPager PagerFragment, и поэтому вы никогда не были на MainFragment в качестве пункта назначения.

Если вы никогда не navigate() в MainFragment или AdminFragment и их можно просматривать только как часть вашего ViewPager, то MainFragment и AdminFragment не должны быть < / strong> в вашем графике. Любые действия из фрагментов в ViewPager PagerFragment должны быть действиями непосредственно на PagerFragment (в том месте, где вы на самом деле находитесь).

2
ianhanniballake 23 Сен 2020 в 18:35

В моем случае я решил проблему, заменив -

 <action
        android:id="@+id/action_mainFragment_to_addTransactionFragment"
        app:destination="@id/addTransactionFragment" />

С участием

 <action
            android:id="@+id/action_mainFragment_to_addTransactionFragment"
            app:popUpToInclusive="true" /* If true then also remove the destination from stack while popup */
            app:popUpTo="@id/mainFragmen"  /*The fragment where to land again from destination*/
            app:destination="@id/addTransactionFragment" />
0
Gk Mohammad Emon 10 Ноя 2020 в 18:35