导航架构组件 - 带有 lambda 表达式的动作导航
Posted
技术标签:
【中文标题】导航架构组件 - 带有 lambda 表达式的动作导航【英文标题】:Navigation Architecture Component - Action Navigation with lambda expression 【发布时间】:2018-10-24 00:46:47 【问题描述】:我添加了一个新动作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)
【问题讨论】:
【参考方案1】:嗯,这是正确的工作方式。方法Navigation.createNavigateOnClickListener()
returns 和View.OnClickListener
并根据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)
这将在按钮单击时执行导航转换。
【讨论】:
【参考方案2】:替换后面的括号
.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)
)
【讨论】:
【参考方案3】:你做的几乎是对的。唯一缺少的是调用“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)
【讨论】:
以上是关于导航架构组件 - 带有 lambda 表达式的动作导航的主要内容,如果未能解决你的问题,请参考以下文章