Компонент архитектуры навигации - Действие Навигация с лямбда-выражением - PullRequest
0 голосов
/ 14 мая 2018

Я добавил новое действие 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)
    }

1 Ответ

0 голосов
/ 14 мая 2018

Ну, это правильный способ работы.Метод Navigation.createNavigateOnClickListener() возвращает a View.OnClickListener и в соответствии с документами правильный способ его определения - использование даже в 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)
}

, который будет выполнять навигационный переход при нажатии кнопки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...