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)
这将在按钮单击时执行导航转换.
归档时间: |
|
查看次数: |
2173 次 |
最近记录: |