Home > Software engineering >  Android Navigation Error: You must call setGraph() before calling getGraph()
Android Navigation Error: You must call setGraph() before calling getGraph()

Time:07-17

I'm trying to make an memo app, and this is my first time with application programming.

When I tried to run the code on my device it just dies after showing the IntroActivity and the error log says: "You must call setGraph() before calling getGraph()"

Below is the code.

class ListActivity : AppCompatActivity() {

    private lateinit var appBarConfiguration: AppBarConfiguration
    private lateinit var binding: ActivityListBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityListBinding.inflate(layoutInflater)
        setContentView(binding.root)

        setSupportActionBar(binding.toolbar)

        val navController = findNavController(R.id.nav_host_fragment_content_list)
        appBarConfiguration = AppBarConfiguration(navController.graph)
        setupActionBarWithNavController(navController, appBarConfiguration)

        binding.fab.setOnClickListener { view ->
            val intent=Intent(applicationContext, DetailActivity::class.java)
            startActivity(intent)
        }
    }

    override fun onSupportNavigateUp(): Boolean {
        val navController = findNavController(R.id.nav_host_fragment_content_list)
        return navController.navigateUp(appBarConfiguration)
                || super.onSupportNavigateUp()
    }
}

When I googled about this error there were only answers about androidx.navigation version 2.3.0-alpha2, so I checked my build.gradle.

I was using 2.5.0, the latest version.

How else can I solve this problem?

activity_list.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ListActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/Theme.DimoMemo.AppBarOverlay">

        <androidx.appcompat.widget.Toolbar
            android:id="@ id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/Theme.DimoMemo.PopupOverlay" />

    </com.google.android.material.appbar.AppBarLayout>

    <include layout="@layout/content_list" />

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@ id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_marginEnd="@dimen/fab_margin"
        android:layout_marginBottom="16dp"
        app:srcCompat="@drawable/ic_add"
        android:layout_marginRight="@dimen/fab_margin" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

content_list.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@ id/contentLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <fragment
        android:id="@ id/nav_host_fragment_content_list"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp" />
</FrameLayout>

CodePudding user response:

check if the layout contains:

app:navGraph="@navigation/nav_graph"
app:defaultNavHost="true"

your nav_host_fragment_content_list must look like:

<fragment
  android:id="@ id/nav_host_fragment_content_list"
  android:name="androidx.navigation.fragment.NavHostFragment"
  android:layout_width="0dp"
  android:layout_height="0dp"
  app:navGraph="@navigation/your_nav_graph"
  app:defaultNavHost="true" />

https://developer.android.com/guide/navigation/navigation-getting-started

  • Related