J'utilise le composant de navigation pour naviguer dans mon application. Cela fonctionne bien à l'intérieur des fragments mais il ne parvient pas à trouver l'hôte de navigation dans l'activité qui contient l'hôte de navigation réel.
J'essaie d'ouvrir un nouveau fragment lorsque l'utilisateur clique sur FAB, que j'ai inclus dans le XML de l'activité principale. Lorsque j'appelle findNavController (), il ne parvient pas à trouver le contrôleur. Le contrôleur d'hôte nav est dans la disposition XML. Je ne peux pas comprendre pourquoi il ne le trouve pas.
Activité principale
class MainActivity : AppCompatActivity(), OnActivityComponentRequest {
override fun getTabLayout(): TabLayout {
return this.tabLayout
}
override fun getFap(): FloatingActionButton {
return this.floatingActionButton
}
private lateinit var tabLayout: TabLayout
private lateinit var floatingActionButton: FloatingActionButton
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
this.tabLayout = tabs
this.floatingActionButton = fab
fab.setOnClickListener {
it.findNavController().navigate(R.id.addNewWorkoutFragment)
}
}
}
Activité principale 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=".domain.MainActivity"
Android:animateLayoutChanges="true">
<com.google.Android.material.appbar.AppBarLayout
Android:layout_height="wrap_content"
Android:layout_width="match_parent"
Android:theme="@style/AppTheme.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
<com.google.Android.material.tabs.TabLayout
Android:id="@+id/tabs"
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<com.google.Android.material.tabs.TabItem
Android:text="Test 1"
Android:layout_height="match_parent"
Android:layout_width="match_parent"/>
<com.google.Android.material.tabs.TabItem
Android:text="Test 2"
Android:layout_height="match_parent"
Android:layout_width="match_parent"/>
</com.google.Android.material.tabs.TabLayout>
</com.google.Android.material.appbar.AppBarLayout>
<fragment
Android:id="@+id/nav_Host_fragment"
Android:name="androidx.navigation.fragment.NavHostFragment"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/main_navigation" />
<com.google.Android.material.bottomappbar.BottomAppBar
Android:id="@+id/bar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="bottom"/>
<com.google.Android.material.floatingactionbutton.FloatingActionButton
Android:id="@+id/fab"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
app:layout_anchorGravity="right|top"
app:layout_anchor="@+id/bar"
Android:src="@drawable/ic_add_black_24dp"/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
Le problème pourrait être que FAB a été ajouté à l'activité ou un fragment différent de celui utilisé par le fragment NavHost. Dans ce cas, lorsque vous appelez it.findNavController()
, il ne trouve pas le contrôleur de navigation.
Vous pouvez soit vérifier que votre FAB appartient au fragment extrait par NavHost, soit appeler la findNavController(<id>)
d'une activité et lui transmettre l'ID du fragment que vous recherchez.
override fun onCreate(savedInstanceState: Bundle?) {
...
fab.setOnClickListener {
findNavController(R.id.nav_Host_fragment)
.navigate(R.id.R.id.addNewWorkoutFragment)
}
}