Navigation action/destination error in Kotlin

45 Views Asked by At

I'm trying to go from StaveniFragment to StaveniZacatecnikFragment after tapping on the stavzac (button id) ImageButton. Somehow, it keeps crashing after tapping the button for the second time.

The Logcat says this (at least I think this is the most interesting part):

java.lang.IllegalArgumentException: Navigation action/destination com.example.ludva2alpha:id/action_staveniFragment_to_staveniZacatecnikFragment cannot be found from the current destination Destination(com.example.ludva2alpha:id/staveniZacatecnikFragment) label=fragment_staveni_zacatecnik class=com.example.ludva2alpha.StaveniZacatecnikFragment

This is the nav_graph.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/staveniFragment">

    <fragment
        android:id="@+id/staveniFragment"
        android:name="com.example.ludva2alpha.StaveniFragment"
        android:label="fragment_staveni"
        tools:layout="@layout/fragment_staveni" >
        <action
            android:id="@+id/action_staveniFragment_to_staveniZacatecnikFragment"
            app:destination="@id/staveniZacatecnikFragment" />
    </fragment>
    <fragment
        android:id="@+id/staveniZacatecnikFragment"
        android:name="com.example.ludva2alpha.StaveniZacatecnikFragment"
        android:label="fragment_staveni_zacatecnik"
        tools:layout="@layout/fragment_staveni_zacatecnik" />
</navigation>

This is the StaveniFragment.kt:

package com.example.ludva2alpha

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageButton
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import com.example.ludva2alpha.databinding.FragmentStaveniBinding

class StaveniFragment : Fragment() {

    private lateinit var binding: FragmentStaveniBinding

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = FragmentStaveniBinding.inflate(inflater, container, false)
        val view = binding.root

        // Find the stavzac ImageButton using data binding
        val stavzacButton: ImageButton = binding.stavzac

        // Set a click listener for the stavzac ImageButton
        stavzacButton.setOnClickListener {
            // Ensure that the fragment is hosted within a NavHostFragment
            val navController = findNavController()
            navController.navigate(R.id.action_staveniFragment_to_staveniZacatecnikFragment)
        }

        return view
    }
}

This is the MainActivity.kt:

package com.example.ludva2alpha

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.fragment.app.Fragment
import androidx.navigation.NavController
import androidx.navigation.findNavController
import androidx.viewpager2.widget.ViewPager2
import com.google.android.material.bottomnavigation.BottomNavigationView

class MainActivity : AppCompatActivity() {

    private lateinit var bottomNavigationView: BottomNavigationView
    var currentPage = 0  // Initialize with the default fragment index (možná tam dej 0)
    private fun updateBottomNavigationBarIcons() {
        when (currentPage) {
            0 -> bottomNavigationView.selectedItemId = R.id.bottom_knihovna
            1 -> bottomNavigationView.selectedItemId = R.id.bottom_staveni
            2 -> bottomNavigationView.selectedItemId = R.id.bottom_domov
            3 -> bottomNavigationView.selectedItemId = R.id.bottom_programovani
            4 -> bottomNavigationView.selectedItemId = R.id.bottom_nastaveni
            // Add more cases if you have additional fragments
        }
    }

    private lateinit var navController: NavController
    override fun onSupportNavigateUp(): Boolean {
        navController = findNavController(R.id.navHostFragmentContainerView)
        return navController.navigateUp() || super.onSupportNavigateUp()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //Splash
        Thread.sleep(3000)
        installSplashScreen()
        //
        setContentView(R.layout.activity_main)


        //viewpager věci
        val viewPager: ViewPager2 = findViewById(R.id.view_pager)
        val fragmets: ArrayList<Fragment> = arrayListOf(
            KnihovnaFragment(),
            StaveniFragment(),
            DomovFragment(),
            ProgramovaniFragment(),
            NastaveniFragment()
        )
        //

        viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
            override fun onPageSelected(position: Int) {
                currentPage = position
                // Update your Bottom Navigation Bar here based on currentPage
                updateBottomNavigationBarIcons()
            }
        })
        val adapter = ViewPagerAdapter(fragmets, this)
        viewPager.adapter = adapter


        bottomNavigationView = findViewById(R.id.bottom_navigation)

        bottomNavigationView.setOnItemSelectedListener { menuItem ->
            val currentItem = when (menuItem.itemId) {
                R.id.bottom_knihovna -> 0
                R.id.bottom_staveni -> 1
                R.id.bottom_domov -> 2
                R.id.bottom_programovani -> 3
                R.id.bottom_nastaveni -> 4
                else -> -1
            }

            if (currentItem >= 0) {
                viewPager.currentItem = currentItem
                true
            } else {
                false
            }
        }

        bottomNavigationView.selectedItemId = R.id.bottom_domov


    }

    /*private fun replaceFragment(fragment: Fragment){
        supportFragmentManager.beginTransaction().replace(R.id.frame_container, fragment).commit()
    } */
}

And this is the StaveniZacatecnikFragment.kt:

package com.example.ludva2alpha

import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment

class StaveniZacatecnikFragment : Fragment() {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        // Find the ImageButton in the layout
       /* val imageButton = view.findViewById<ImageButton>(R.id.stavzac)

        // Set an OnClickListener for the ImageButton to navigate to StaveniZacatecnikFragment
        imageButton.setOnClickListener {
            // Use findNavController().navigate to navigate to the desired fragment
            findNavController().navigate(StaveniFragmentDirections.actionStaveniFragmentToStaveniZacatecnikFragment())
        }*/
    }
}

I tried rearranging the order of the code parts in MainActivity, checked typos, asked several AIs several times, switched StaveniZacatecnikFragment for another fragment, did a clean rebuild and probably some other things.

0

There are 0 best solutions below