Почему у меня есть StackOverflowError при реализации Включить в контроллер навигации? - PullRequest
0 голосов
/ 04 февраля 2019

файл моего проекта: https://drive.google.com/file/d/11llz7ylWe7ACyLMBbqp6YzugUL8hhImt/view?usp=sharing

, поэтому у меня 2 навигационных графика.называется основной навигационный граф, а также аутентификационный граф.

Я включаю основной граф в аутентификационный график и наоборот, аутентификационный граф в основной граф.

Я хочу реализовать систему входа в систему, поэтому, когда пользователь успешнопосле входа в систему пользователь перейдет к основному действию (которое имеет нижнюю навигационную панель и панель инструментов), у авторизационной деятельности нет нижней навигационной панели или фрагмента.вот графики

  1. основной навигационный график:

enter image description here

<?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/navigation_graph"
            app:startDestination="@id/destination_home">

    <include app:graph="@navigation/auth_graph" />

    <fragment android:id="@+id/destination_home" android:name="com.muchammadagunglaksana.navcontroller.HomeFragment"
              android:label="Home Judul" tools:layout="@layout/fragment_home">
        <action android:id="@+id/action_toAuthActivity" app:destination="@id/auth_graph"/>
    </fragment>


    <fragment android:id="@+id/destination_camera" android:name="com.muchammadagunglaksana.navcontroller.CameraFragment"
              android:label="Camera Judul" tools:layout="@layout/fragment_camera">
        <action android:id="@+id/toPhotosDestination" app:destination="@id/destination_photos"/>
    </fragment>


    <fragment android:id="@+id/destination_photos" android:name="com.muchammadagunglaksana.navcontroller.PhotosFragment"
              android:label="Foto Judul" tools:layout="@layout/fragment_photos">
        <action android:id="@+id/toHomeDestination" app:destination="@id/destination_home"/>
        <argument android:name="numberOfPhotos" app:argType="integer" android:defaultValue="0"/>
    </fragment>


    <fragment android:id="@+id/destination_settings"
              android:name="com.muchammadagunglaksana.navcontroller.SettingsFragment"
              android:label="Setting Judul" tools:layout="@layout/fragment_settings"/>
</navigation>

График аутентификации: enter image description here

<include app:graph="@navigation/navigation_graph" />

<fragment android:id="@+id/loginFragment" android:name="com.muchammadagunglaksana.navcontroller.LoginFragment"
          android:label="fragment_login" tools:layout="@layout/fragment_login">
    <action android:id="@+id/action_toMainActivity" app:destination="@id/navigation_graph"/>
</fragment>

при нажатии кнопки входа в системуLoginFragment затем я использую код ниже:

       login_button.setOnClickListener {
            Navigation.findNavController(it).navigate(R.id.action_toMainActivity)
        }

, а также в HomeFragment, когда кнопка выхода из системы нажала, я использую:

logout_button.setOnClickListener {
            Navigation.findNavController(it).navigate(R.id.action_toAuthActivity)
        }

, но я получил stackoverflowerror:

E / AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.muchammadagunglaksana.navcontroller, PID: 14322 java.lang.StackOverflowError: размер стека 8 МБ в android.support.v4.util.SparseArrayCompatCompatCatat ((77) в android.support.v4.util.SparseArrayCompat. (SparseArrayCompat.java:62) в androidx.navigation.NavGraph. (NavGraph.java:44) в androidx.navigation.NavGraphNavigator.createDestination (NavGraphNavigator)androidx.navigation.NavGraphNavigator.createDestination (NavGraphNavigator.java:29) в androidx.navigation.NavInflater.inflate (NavInflater.java:100) в androidx.navigation.NavInflater.inflate (NavInflater.javaxnigatig andigavig at80)n.NavInflater.inflate (NavInflater.java:128) в androidx.navigation.NavInflater.inflate (NavInflater.java:80) в androidx.navigation.NavInflater.inflate (NavInflater.java:128) в androidx.navigation.NfInflater(NavInflater.java:80) в androidx.navigation.NavInflater.inflate (NavInflater.java:128) в androidx.navigation.NavInflater.inflate (NavInflater.java:80) в androidx.navigation.NavInflater.inflate (NavInflater.j:128) на androidx.navigation.NavInflater.inflate (NavInflater.java:80) на androidx.navigation.NavInflater.inflate (NavInflater.java:128)

na.navcontroller E / JavaBinder: !!!СБОЙ СДЕЛКИ БИНДЕРА !!!

что пошло не так?

1 Ответ

0 голосов
/ 04 февраля 2019

Тег <include> является точным эквивалентом копирования / вставки точного содержимого включаемого графика вместо <include>.Имея auth_graph, включающий navigation_graph, вы построили цикл: navigation_graph содержит auth_graph, который содержит navigation_graph и включается вечно.

Что вам нужно сделать, это удалить<include app:graph="@navigation/navigation_graph" /> от вашего auth_graph.Поскольку ваш auth_graph уже находится в пределах navigation_graph, вам не нужно добавлять его повторно, но вы можете напрямую ссылаться на любой из этих пунктов назначения.

...