Reputation: 11
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