导航架构组件 - 使用lambda表达式的操作导航

Ahm*_*idi 16 android kotlin android-architecture-components android-jetpack android-architecture-navigation

我添加了一个新动作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>
Run Code Online (Sandbox Code Playgroud)

调用导航操作时,如果我使用,导航工作正常:

 view.findViewById<Button>(R.id.navigate_action_bt)?.setOnClickListener(
            Navigation.createNavigateOnClickListener(R.id.go_to_step_one, null)
    )
Run Code Online (Sandbox Code Playgroud)

但是当用lambda调用它时,它不起作用:

 view.findViewById<Button>(R.id.navigate_action_bt)?.setOnClickListener {
        Navigation.createNavigateOnClickListener(R.id.go_to_step_one, null)
    }
Run Code Online (Sandbox Code Playgroud)

Lev*_*ira 24

嗯,这是正确的工作方式.该方法Navigation.createNavigateOnClickListener() 返回一个View.OnClickListener并根据文档正确的分配方法是使用,即使在Kotlin中:

button.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.next_fragment, null));
Run Code Online (Sandbox Code Playgroud)

如果你在lambda中使用这个方法,那么lambda本身就是click监听器,所以你在click监听器中返回一个click监听器,这就是它无法工作的原因.就像这样做:

button.setOnClickListener {
            View.OnClickListener {
                Toast.makeText(this, "hi", Toast.LENGTH_LONG).show()
            }
        }
Run Code Online (Sandbox Code Playgroud)

你可能感兴趣的是这个:

 view.findViewById<Button>(R.id.navigate_action_bt)?.setOnClickListener { view ->
   view.findNavController().navigate(R.id.go_to_step_one)
}
Run Code Online (Sandbox Code Playgroud)

这将在按钮单击时执行导航转换.