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.