【问题标题】:Android - How to achieve setOnClickListener in Kotlin?Android - 如何在 Kotlin 中实现 setOnClickListener?
【发布时间】:2017-11-02 05:37:23
【问题描述】:

我想知道我们如何在 Kotlin 中为 Android 开发设置基本的 onClickListener。

【问题讨论】:

  • 这可能很受欢迎,因为 Android Studio 将 Java 转换为 button.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View) { /*do work*/} }),然后提供关于他们生成的代码的建议,我们应该将其转换为 lambda。
  • Kotlin 太不直观了。不知道为什么 Google 会在这方面投入这么多
  • 为什么每个人都发布相同的答案,但略有不同?答案很简单view.setOnClickListener { ... }。似乎每个人都如此渴望赢得声誉。

标签: android listener kotlin


【解决方案1】:

SetOnClickListener有五种使用方式:

第一:

button.setOnClickListener {
    // Do some work here
}

第二:

button.setOnClickListener(object : View.OnClickListener {
    override fun onClick(view: View?) {
        // Do some work here
    }

})

第三:

button.setOnClickListener(View.OnClickListener { view ->
    // Do some work here
})

第四:

class MainActivity : AppCompatActivity(), View.OnClickListener{

    lateinit var button : Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        button = findViewById(R.id.button1)
        button.setOnClickListener(this)
    }

    override fun onClick(view: View?) {
        when(view?.id){
            R.id.button1->{
                // do some work here
            }
        }
    }
}

第五名:

class MainActivity : AppCompatActivity(){

    lateinit var button : Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        button = findViewById(R.id.button1)
        button.setOnClickListener(listener)
    }

    val listener= View.OnClickListener { view ->
        when (view.getId()) {
            R.id.button1 -> {
                // Do some work here
            }
        }
    }
}

干杯!

【讨论】:

  • 感谢您花时间展示不同的方式。我选择了 no2 :)
  • 在 Kotlin 中调用的这种直接“大括号括起来的代码块”“传递”是什么?
  • lambda 表达式。
  • @Naimatullah 太好了,你写了所有可能的条件。
  • 如果侦听器中有多个参数,第三种方式将如下所示button.setOnClickListener(View.OnClickListener { firstArg, secondArg, thirdArg ->
【解决方案2】:

假设你有 textView 可以点击

text_view.text = "Hello Kotlin";

text_view.setOnClickListener {
    val intent = Intent(this@MainActivity, SecondActivity::class.java)
    intent.putExtra("key", "Kotlin")
    startActivity(intent)
}

【讨论】:

  • 哦,是的!类型推断会处理所有混乱的部分。谢谢!
  • 有人可以指出我在 Kotlin 中使用函数式接口 args 调用方法的这种方式吗?通常在Java中,我只会做 textView.SetOnClickListener(view -> { doSomething() });
【解决方案3】:

使用下面的代码

val textview = findViewById<TextView>(R.id.textview)
textview.setOnClickListener(clickListener)

val button = findViewById<Button>(R.id.button)
button.setOnClickListener(clickListener)

clickListener 代码。

val clickListener = View.OnClickListener {view ->

    when (view.getId()) {
        R.id.textview -> firstFun()
        R.id.button -> secondFun()
    }
}

【讨论】:

    【解决方案4】:

    这是一个关于如何在 Kotlin 中使用 onClickListener 的示例

    button1.setOnClickListener(object : View.OnClickListener{
                override fun onClick(v: View?) {
                    //Your code here
                }})
    

    【讨论】:

    • 所有看起来都很接近,显然“对象”不在大括号中。我浪费了一些时间
    【解决方案5】:

    方法一:

    txtNext.setOnClickListener {
            //Code statements
        }
    

    方法二:

    class FirstActivity : AppCompatActivity(), View.OnClickListener {
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_first)
        txtNext.setOnClickListener(this)
    }
    
    override fun onClick(v: View) {
        when (v.id) {
            R.id.txtNext -> {
                //Code statements
            }
            else -> {
                // else condition
            }
        }
      }
    }
    

    【讨论】:

      【解决方案6】:

      对于使用多个 id:

      textview1.setOnClickListener(clickListener)
      textview2.setOnClickListener(clickListener)
      

      创建匿名类:

       private val clickListener: View.OnClickListener = View.OnClickListener { view ->
          when (view.id) {
              R.id.textview1-> { 
                 Toast.makeText(this, "Clicked 1", Toast.LENGTH_SHORT).show()
              }
              R.id.textview2-> { 
                 Toast.makeText(this, "Clicked 2", Toast.LENGTH_SHORT).show()
              }
          }
      }
      

      【讨论】:

      • 在我的情况下它正在抛出 nullPointerException 。你能帮帮我吗
      • 检查您的视图 ID,确保它们存在 xml 文件。
      • 它们存在于xml中
      • 分享您的源代码,包括 XML。
      【解决方案7】:

      首先,您必须获取对视图的引用(例如 Button、TextView 等)并使用 setOnClickListener() 方法将 OnClickListener 设置为引用

      // get reference to button
      val btn_click_me = findViewById(R.id.btn_click_me) as Button
      // set on-click listener
      btn_click_me.setOnClickListener {
          Toast.makeText(this@MainActivity, "You clicked me.", Toast.LENGTH_SHORT).show()
      }
      

      请参阅Kotlin SetOnClickListener Example 以获取完整的 Kotlin Android 示例,其中按钮存在于 Activity 中并且 OnclickListener 应用于按钮。当您单击按钮时,将执行 SetOnClickListener 块中的代码。

      更新

      现在您可以通过在 Class 文件中包含以下导入语句直接使用按钮的 id 来引用该按钮。 Documentation.

      import kotlinx.android.synthetic.main.activity_main.*
      

      然后是按钮

      btn_click_me.setOnClickListener {
          // statements to run when button is clicked
      }
      

      请参考Android Studio Tutorial

      【讨论】:

        【解决方案8】:

        使用此代码在 Kotlin 中添加 onClickListener

        val button : Button = getView()?.findViewById<Button>(R.id.testButton) as Button
        button.setOnClickListener {view ->
                 Toast.makeText(context, "Write your message here", Toast.LENGTH_LONG).show()
            }
        }
        

        【讨论】:

          【解决方案9】:

          只需在kotlin中获取OnClickListener

          view1.setOnClickListener{
          
          //body 
          
          }
          

          【讨论】:

            【解决方案10】:

            我在这里看到很多建议,但是这个集合缺少以下内容。

            button.setOnClickListener(::onButtonClicked)
            

            在当前类中,我们有一个这样的方法:

            private fun onButtonClicked(view: View) {
                 // do stuff
            }
            

            【讨论】:

              【解决方案11】:

              var tv = findViewById(R.id.tv) 作为文本视图

                  tv.setOnClickListener {
                     val i = Intent(this@MainActivity, SecondActivity::class.java)
                     startActivity(i)
                     finish()
                  }
              

              【讨论】:

              • 请使用这个非常简单(设置id,点击监听器并导航一个类到另一个类)
              • 欢迎来到 Stack Overflow!请不要把你的源代码扔在这里。友善一点,并尝试对您的答案进行漂亮的描述,以便其他人会喜欢并支持它。见:How do I write a good answer?
              【解决方案12】:

              一种简单的方法是注册一个点击监听器并使用 lambda 表达式创建一个点击监听器。

              override fun onCreate(savedInstanceState: Bundle?) {
                  super.onCreate(savedInstanceState)
                  setContentView(R.layout.activity_main)
              
                  // click listener registered
                  myButton.setOnClickListener(clickListener)
              }
              

              并实现clickListener

              private val clickListener: View.OnClickListener = View.OnClickListener { _ ->
                  // do something here
              }
              

              如果您需要视图来使用它,您可以将_ 替换为名称。比如需要查看点击监听的id。

              private val clickListener: View.OnClickListener = View.OnClickListener { view ->
                  if(view.id == login.id) {
                      // do something here
                  }
              }
              

              【讨论】:

                【解决方案13】:
                    val button = findViewById<Button>(R.id.button)
                    button.setOnClickListener {
                        val intent = 
                    Intent(this@MainActivity,ThirdActivity::class.java)
                        intent.putExtra("key", "Kotlin")
                        startActivity(intent)
                    }
                

                【讨论】:

                  【解决方案14】:
                  **i have use kotlin-extension so i can access directly by button id:**
                  
                  
                  btnSignIN.setOnClickListener {
                              if (AppUtils.isNetworkAvailable(activity as BaseActivity)) {
                                  if (checkValidation()) {
                  
                                      hitApiLogin()
                                  }
                              }
                          }
                  

                  【讨论】:

                    【解决方案15】:

                    有几种不同的方法可以实现这一点,正如这个问题的各种答案所示。

                    要将侦听器实际分配给视图,您可以使用与 Java 中相同的方法:

                    button.setOnClickListener()
                    

                    不过,Kotlin 可以轻松地将 lambda 分配为侦听器:

                    button.onSetClickListener {
                        // Listener code
                    }
                    

                    或者,如果您想将此侦听器用于多个视图,请考虑使用 lambda 表达式(分配给变量/值以供参考的 lambda):

                    val buttonClickListener = View.OnClickListener { view ->
                        // Listener code
                    }
                    
                    button.setOnClickListener(buttonClickListener)
                    another_button.setOnClickListener(buttonClickListener)
                    

                    【讨论】:

                      【解决方案16】:

                      只需执行以下操作:

                      button.setOnClickListener{doSomething()}

                      【讨论】:

                        【解决方案17】:
                        findViewById<Button>(R.id.signUp)?.setOnClickListener(
                            Toast.makeText(mActivity, "Button Clicked", Toast.LENGTH_LONG).show()
                        )
                        

                        【讨论】:

                          【解决方案18】:
                             button.setOnClickListener {
                                    //write your code here
                             }
                          

                          【讨论】:

                          • 这个答案和之前的一样。
                          【解决方案19】:

                          使用 kotlin 在 android 中实现按钮 OnClickListener。

                          首先从 .xml 文件创建按钮视图

                                       `<Button
                                          android:id="@+id/btn2"
                                          android:layout_width="match_parent"
                                          android:layout_height="match_parent"
                                          android:text="Button2"
                                          android:layout_weight="0.5"/>`
                          

                          //在Activity中创建按钮实例

                           private var btn1:Button?=null
                          

                          //对于后期初始化可以这样跟随,

                          private lateinit var btn1:Button
                          

                          //在onCreate中,

                           btn1=findViewById(R.id.btn1) as Button
                          
                               btn1?.setOnClickListener { btn1Click() }
                          

                          //从Function中实现按钮的OnClick事件,

                           private fun btn1Click() {
                                  Toast.makeText(this, "button1", Toast.LENGTH_LONG).show()
                              }
                          

                          【讨论】:

                            【解决方案20】:

                            您可以使用view.setOnClickListener{ // your task to execute }

                            Kotlin 类型推断和自动 lambda 表达式将处理样板文件。 注意:这里的视图可以是 TextView 或按钮等。

                            【讨论】:

                              【解决方案21】:

                              你像在 kotlin 中那样使用 onclickListener

                              val fab = findViewById(R.id.fab) as FloatingActionButton
                              fab.setOnClickListener {  
                              ...
                              }
                              

                              【讨论】:

                                【解决方案22】:

                                首先找到按钮,为了防止从View投射,你可以使用&lt;&gt;如下:

                                val button = findViewById<Button>(R.id.button);
                                

                                一旦您有了Button 的实例,您现在可以按如下方式附加点击侦听器:

                                button.setOnClickListener {  
                                 // You code here
                                }
                                

                                【讨论】:

                                  【解决方案23】:

                                  这是解决方案。你的代码会是这样的:

                                  button.setOnClickListener {
                                              //your code here
                                          }
                                  

                                  无需添加任何内容。如下:

                                  val button = findViewById<Button>(R.id.Button)
                                  button.setOnClickListener {
                                  
                                  }
                                  

                                  【讨论】:

                                    【解决方案24】:
                                    val saveButton:Button = findViewById(R.id.button_save)
                                    
                                    saveButton.setOnClickListener{
                                    // write code for click event
                                    }
                                    
                                    with view object
                                    saveButton.setOnClickListener{
                                    view -> // write code for click event
                                    }
                                    

                                    【讨论】:

                                      【解决方案25】:

                                      据我所知,实现这一目标的最简单方法是通过 Kotlin Android 扩展。

                                      在你的 app/build.gradle 上

                                      apply plugin: 'kotlin-android-extensions'

                                      如果您的按钮名为“btnAdd”,则在您的片段或活动中导入以下内容:

                                      import kotlinx.android.synthetic.main.fragment_transactions.btnAdd

                                       override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
                                          super.onViewCreated(view, savedInstanceState)
                                      
                                          btnAdd.setOnClickListener {
                                              Toast.makeText(context , "Done", 10).show()
                                          }
                                      }
                                      

                                      【讨论】:

                                        【解决方案26】:

                                        如果您想在 Kotlin 中模拟旧的匿名方式,我发现这非常有效。

                                         btnNewWay!!.setOnClickListener(object:View.OnClickListener {
                                            override fun onClick(v: View?) {
                                                //Your Code Here!
                                            }})
                                        

                                        【讨论】:

                                          【解决方案27】:

                                          像这样在按钮上添加clickListener

                                              btUpdate.setOnClickListener(onclickListener)
                                          

                                          将此代码添加到您的活动中

                                           val onclickListener: View.OnClickListener = View.OnClickListener { view ->
                                                  when (view.id) {
                                                      R.id.btUpdate -> updateData()
                                          
                                          
                                                  }
                                              }
                                          

                                          【讨论】:

                                            【解决方案28】:

                                            你可以在 Kotlin 中像这样使用 setOnClickListener

                                            button.setOnClickListener(View.OnClickListener {        
                                                   //code
                                            })
                                            

                                            【讨论】:

                                              【解决方案29】:

                                              在 build.gradle 模块文件中添加

                                              android {
                                                  ...
                                                  buildFeatures {
                                                      viewBinding true
                                                  }
                                              }
                                              

                                              对于活动添加

                                              private lateinit var binding: ResultProfileBinding
                                              override fun onCreate(savedInstanceState: Bundle?) {
                                                  super.onCreate(savedInstanceState)
                                                  binding = ResultProfileBinding.inflate(layoutInflater)
                                                  val view = binding.root
                                                  setContentView(view)
                                              }
                                              

                                              点击添加

                                              binding.button.setOnClickListener { Log.d("TAG", "Example") }
                                              

                                              【讨论】:

                                                【解决方案30】:

                                                如果其他人想在使用绑定时实现这一点。如果您的视图的 id 是 button_save 则可以编写此代码,利用 kotlin apply 语法

                                                binding.apply {
                                                         button_save.setOnClickListener {
                                                             //dosomething
                                                         }
                                                     }
                                                

                                                注意 binding 是为 xml 文件创建的绑定实例的名称。如果您在片段中编写代码,则完整代码如下。 Activity 的工作方式类似

                                                 private lateinit var binding: FragmentProfileBinding
                                                
                                                  override fun onCreateView(
                                                    inflater: LayoutInflater, container: ViewGroup?,
                                                    savedInstanceState: Bundle?
                                                ): View? {
                                                    // Inflate the layout for this fragment
                                                    binding = FragmentProfileBinding.inflate(inflater, container, false)
                                                 
                                                  return binding.root
                                                }
                                                
                                                // onActivityCreated is deprecated in fragment
                                                override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
                                                    super.onViewCreated(view, savedInstanceState)
                                                   binding.apply {
                                                     button_save.setOnClickListener {
                                                         //dosomething
                                                     }
                                                     }
                                                 }
                                                

                                                【讨论】:

                                                  猜你喜欢
                                                  • 1970-01-01
                                                  • 1970-01-01
                                                  • 1970-01-01
                                                  • 2020-05-08
                                                  • 1970-01-01
                                                  • 2017-10-24
                                                  • 1970-01-01
                                                  • 2023-04-10
                                                  • 2020-09-05
                                                  相关资源
                                                  最近更新 更多