25

我添加了一个新动作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>

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

 view.findViewById<Button>(R.id.navigate_action_bt)?.setOnClickListener(
            Navigation.createNavigateOnClickListener(R.id.go_to_step_one, null)
    )

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

 view.findViewById<Button>(R.id.navigate_action_bt)?.setOnClickListener {
        Navigation.createNavigateOnClickListener(R.id.go_to_step_one, null)
    }
4

3 回答 3

44

嗯,这是正确的工作方式。该方法Navigation.createNavigateOnClickListener() 返回aView.OnClickListener并且根据文档,即使在 Kotlin 中,使用它的正确方法也是:

button.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.next_fragment, null));

如果您在 lambda 中使用该方法,则 lambda 本身就是点击侦听器,因此您在点击侦听器中返回一个点击侦听器,这就是它不起作用的原因。就像这样做:

button.setOnClickListener {
            View.OnClickListener {
                Toast.makeText(this, "hi", Toast.LENGTH_LONG).show()
            }
        }

你可能感兴趣的是:

 view.findViewById<Button>(R.id.navigate_action_bt)?.setOnClickListener { view ->
   view.findNavController().navigate(R.id.go_to_step_one)
}

它将在按钮单击时执行导航转换。

于 2018-05-14T11:29:31.710 回答
1

用括号替换 .setOnClickListener后面的括号

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

 view.findViewById<Button>(R.id.navigate_action_bt)?.setOnClickListener(
    Navigation.createNavigateOnClickListener(R.id.go_to_step_one, null)
)
于 2020-10-08T08:08:49.553 回答
0

你做的几乎是对的。唯一缺少的是调用“onClick”方法。让我在这里添加我的工作代码块。

override fun onClick(v: View) {
    when(v) {
        dashboardButton -> Navigation.createNavigateOnClickListener(LoginFragmentDirections.actionLoginFragmentToDashboardFragment()).onClick(v)
        registerButton -> Navigation.createNavigateOnClickListener(LoginFragmentDirections.actionLoginFragmentToRegisterFragment()).onClick(v)
    }
}

在您的代码中,您应该进行这样的更改。

 view.findViewById<Button>(R.id.navigate_action_bt)?.setOnClickListener {
    Navigation.createNavigateOnClickListener(R.id.go_to_step_one, null).onClick(view)
}
于 2020-12-12T17:35:07.217 回答