新しいアクションを追加しました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)
)
しかし、ラムダで呼び出すと機能しません:
view.findViewById<Button>(R.id.navigate_action_bt)?.setOnClickListener {
Navigation.createNavigateOnClickListener(R.id.go_to_step_one, null)
}
まあ、それは正しい働き方です。メソッドNavigation.createNavigateOnClickListener()
returns a View.OnClickListener
および docs によると、Kotlinでさえ、それを使用することによる適切な方法です。
button.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.next_fragment, null));
ラムダ内でメソッドを使用する場合、ラムダ自体がクリックリスナーであるため、クリックリスナー内でクリックリスナーを返すため、機能しません。それはこれをするようなものです:
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)
}
ボタンをクリックするとナビゲーション遷移が実行されます。