导航架构组件 - 使用 lambda 表达式的操作导航
Navigation Architecture Component - Action Navigation with lambda expression
我添加了一个新动作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)
}
嗯,这才是正确的工作方式。方法 Navigation.createNavigateOnClickListener()
returns a View.OnClickListener
and according to the docs 分配它的正确方法是使用,即使在 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)
}
这将在单击按钮时执行导航转换。
替换后面的括号
.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)
)
你几乎做对了。唯一缺少的是调用 '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)
}
我添加了一个新动作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)
}
嗯,这才是正确的工作方式。方法 Navigation.createNavigateOnClickListener()
returns a View.OnClickListener
and according to the docs 分配它的正确方法是使用,即使在 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)
}
这将在单击按钮时执行导航转换。
替换后面的括号
.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)
)
你几乎做对了。唯一缺少的是调用 '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)
}