web-dev-qa-db-ja.com

ナビゲーションアーキテクチャコンポーネント-ラムダ式を使用したアクションナビゲーション

新しいアクションを追加しました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)
    }
21
Ahmed Abidi

まあ、それは正しい働き方です。メソッド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)
}

ボタンをクリックするとナビゲーション遷移が実行されます。

21
Levi Moreira