J'ai ajouté une nouvelle action Navigation.xml
:
<fragment
Android:id="@+id/launcher_home"
Android:name="com.example.Android.codelabs.navigation.MainFragment"
Android:label="@string/home"
tools:layout="@layout/main_fragment">
<action
Android:id="@+id/go_to_step_one"
app:destination="@id/flow_step_one" />
</fragment>
Lors de l'appel de l'action de navigation, si j'utilise, la navigation fonctionne correctement:
view.findViewById<Button>(R.id.navigate_action_bt)?.setOnClickListener(
Navigation.createNavigateOnClickListener(R.id.go_to_step_one, null)
)
Mais lorsque vous l'appelez avec un lambda, cela ne fonctionne pas:
view.findViewById<Button>(R.id.navigate_action_bt)?.setOnClickListener {
Navigation.createNavigateOnClickListener(R.id.go_to_step_one, null)
}
Eh bien, c'est la bonne façon de travailler. La méthode Navigation.createNavigateOnClickListener()
renvoie a View.OnClickListener
et selon le docs la bonne façon de l'assigner est d'utiliser, même dans Kotlin:
button.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.next_fragment, null));
Si vous utilisez la méthode à l'intérieur du lambda, le lambda lui-même est l'écouteur de clics, vous renvoyez donc un écouteur de clics à l'intérieur de l'écouteur de clics, c'est pourquoi cela ne fonctionne pas. C'est comme faire ça:
button.setOnClickListener {
View.OnClickListener {
Toast.makeText(this, "hi", Toast.LENGTH_LONG).show()
}
}
Ce qui pourrait vous intéresser, c'est ceci:
view.findViewById<Button>(R.id.navigate_action_bt)?.setOnClickListener { view ->
view.findNavController().navigate(R.id.go_to_step_one)
}
Qui effectuera la transition de navigation lors du clic sur le bouton.