You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Navigation组件:Lambda表达式调用导航Action失效问题

为什么用Lambda包裹Navigation.createNavigateOnClickListener后导航失效?

先说说你的场景:你已经在Navigation.xml里配置了正确的导航Action:

<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>

直接把Navigation.createNavigateOnClickListener的返回值传给setOnClickListener时,导航完全正常:

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(...)会直接返回一个已经实现好的OnClickListener实例,你把这个实例传给setOnClickListener,当按钮被点击时,系统会自动调用这个实例的onClick()方法,触发导航逻辑。
  • 而第二种Lambda写法,你其实是自己实现了一个OnClickListener:当按钮被点击时,Lambda里的代码会执行——但你只是调用了createNavigateOnClickListener创建了另一个OnClickListener对象,却从来没调用这个对象的onClick()方法!相当于你造了个开关,但没按它,自然不会有任何反应。

怎么修正?

如果一定要用Lambda包裹(其实完全没必要,第一种写法更简洁),你需要手动调用返回的Listener的onClick方法:

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

当然,更推荐的还是直接用第一种写法,不需要多此一举套Lambda——毕竟createNavigateOnClickListener就是专门用来生成OnClickListener的,直接传它的返回值就够了。

内容的提问来源于stack exchange,提问作者Ahmed Abidi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:33:38