Cmx Cix
Cmx Cix

Reputation: 11

How to use bottom navigation view to navigate to a fragmnet that requires an argument

I simply want to navigate using my bottom nav view from one fragment, to another, but the destination fragment requires an argument, how do I do this? I have looked for documentation on this but could not find any, the error is fired when i click on the icon on the bottom nav view

This is the main activity

package com.andpro.android.criminalintent

import android.os.Bundle
import android.view.MenuItem
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.NavController
import androidx.navigation.findNavController
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.onNavDestinationSelected
import androidx.navigation.ui.setupWithNavController
import com.google.android.material.bottomnavigation.BottomNavigationView

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val navHostFragment: NavHostFragment =
            supportFragmentManager.findFragmentById(R.id.fragment_container) as 
        NavHostFragment
       val navController: NavController = navHostFragment.navController

       val bottom_nav = findViewById<BottomNavigationView>(R.id.bottom_nav)
       bottom_nav.setupWithNavController(navController)

}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    val navController = findNavController(R.id.fragment_container)
    return item.onNavDestinationSelected(navController)
            || super.onOptionsItemSelected(item)
}

}

THis is the nav graph

<?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.xml"
    app:startDestination="@id/crimeListFragment">

    <fragment
        android:id="@+id/crimeListFragment"
        android:name="com.andpro.android.criminalintent.CrimeListFragment"
        android:label="fragment_crime_list"
        tools:layout="@layout/fragment_crime_list" >
        <action
            android:id="@+id/action_crimeListFragment_to_crimeDetailFragment"
            app:destination="@id/crimeDetailFragment" />
    </fragment>
    <fragment
        android:id="@+id/crimeDetailFragment"
        android:name="com.andpro.android.criminalintent.CrimeDetailFragment"
        android:label="CrimeDetailFragment" >
        <argument
            android:name="crime_id"
            app:argType="java.util.UUID" />
        <action
            android:id="@+id/action_crimeDetailFragment_to_datePicker"
            app:destination="@id/datePicker" />
    </fragment>
    <dialog
        android:id="@+id/datePicker"
        android:name="com.andpro.android.criminalintent.DatePicker"
        android:label="DatePicker" >
        <argument
            android:name="crime"
            app:argType="com.andpro.android.criminalintent.CrimeClass" />
    </dialog>
</navigation>

and this is the error i get when i try to navigate without specifying the argument for the destination. I dont want to hardcode a default value(i dont even know how to do this) I want to do it programatically in the main activity file. Please help

 FATAL EXCEPTION: main (Ask Gemini)
                                                                                                    Process: com.andpro.android.criminalintent, PID: 30469
                                                                                                    java.lang.IllegalArgumentException: Required argument "crime_id" is missing and does not have an android:defaultValue
                                                                                                        at com.andpro.android.criminalintent.CrimeDetailFragmentArgs$Companion.fromBundle(CrimeDetailFragmentArgs.kt:63)
                                                                                                        at com.andpro.android.criminalintent.CrimeDetailFragment.onCreate(CrimeDetailFragment.kt:31)
                                                                                                        at androidx.fragment.app.Fragment.performCreate(Fragment.java:3099)
                                                                                                        at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:524)
                                                                                                        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)
                                                                                                        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2214)
                                                                                                        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2115)
                                                                                                        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2052)
                                                                                                        at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:703)
                                                                                                        at android.os.Handler.handleCallback(Handler.java:958)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:230)
                                                                                                        at android.os.Looper.loop(Looper.java:319)
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:8919)
                                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578)
                                                                 

                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)

Upvotes: 0

Views: 31

Answers (0)

Related Questions