【问题标题】:Navigation Architecture Component - Action Navigation with lambda expression导航架构组件 - 带有 lambda 表达式的动作导航
【发布时间】:2018-10-24 00:46:47
【问题描述】:

我添加了一个新动作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)
    )

但是当用 lambda 调用它时,它不起作用:

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

【问题讨论】:

    标签: android kotlin android-architecture-components android-jetpack android-architecture-navigation


    【解决方案1】:

    嗯,这是正确的工作方式。方法Navigation.createNavigateOnClickListener() returnsView.OnClickListener 并根据docs 分配它的正确方法是使用,即使在Kotlin 中:

    button.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.next_fragment, null));
    

    如果您在 lambda 中使用该方法,则 lambda 本身就是点击侦听器,因此您在点击侦听器中返回了一个点击侦听器,这就是它不起作用的原因。就像这样做:

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

    这将在按钮单击时执行导航转换。

    【讨论】:

      【解决方案2】:

      替换后面的括号 .setOnClickListener带括号

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

      【讨论】:

        【解决方案3】:

        你做的几乎是对的。唯一缺少的是调用“onClick”方法。让我在这里添加我的工作代码块。

        override fun onClick(v: View) {
            when(v) {
                dashboardButton -> Navigation.createNavigateOnClickListener(LoginFragmentDirections.actionLoginFragmentToDashboardFragment()).onClick(v)
                registerButton -> Navigation.createNavigateOnClickListener(LoginFragmentDirections.actionLoginFragmentToRegisterFragment()).onClick(v)
            }
        }
        

        在您的代码中,您应该进行这样的更改。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-29
          • 2019-04-27
          • 1970-01-01
          相关资源
          最近更新 更多