web-dev-qa-db-fra.com

Composant d'architecture de navigation - Navigation d'action avec expression lambda

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)
    }
21
Ahmed Abidi

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.

21
Levi Moreira