Android-如何在Kotlin中实现setOnClickListener?


104

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


6
这个问题怎么能有43票?
雨果·阿莱克西斯·卡多纳,

5
它可能很流行,因为Android Studio会将Java转换为Java button.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View) { /*do work*/} }),然后提供有关其生成代码的建议,我们应该将其转换为lambda。
乔·拉普

6
Kotlin真是直觉。不知道为什么Google要在它
上面

2
为什么每个人发布的答案都略有不同?答案很简单view.setOnClickListener { ... }。似乎每个人都渴望获得声誉。
阿齐兹

Answers:


69

假设您要单击textView

text_view.text = "Hello Kotlin";

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

1
哦耶!类型推断可以消除​​所有混乱的位。谢谢!
乔·拉普

46

使用以下代码

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

28

这是有关如何在Kotlin中使用onClickListener的示例

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

所有人看上去都很近,“对象”显然不在大括号中。我浪费了一些时间
M. Usman Khan

26

有五种使用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
            }
        }
    }
}

干杯!


26

方法1:

txtNext.setOnClickListener {
        //Code statements
    }

方法2:

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

15

对于使用多个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。您能帮我吗
MashukKhan

检查您的视图ID,确保它们存在xml文件。
Luvnish Monga

它们存在于xml中
MashukKhan

共享您的源包括XML。
Luvnish Monga

6

首先,您必须获取对View的引用(例如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示例以获取完整的Kotlin Android示例,其中活动中存在按钮,并且OnclickListener应用于该按钮。当您单击按钮时,将执行SetOnClickListener块中的代码。

更新资料

现在,您可以通过在类文件中包含以下导入语句来直接引用按钮的ID。文件资料

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

然后按一下按钮

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

请参阅Android Studio教程


5

使用此代码添加onClickListenerKotlin

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


5

我在这里看到了很多建议,但是此收藏缺少以下内容。

button.setOnClickListener(::onButtonClicked)

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

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

5

var tv = findViewById(R.id.tv) 作为TextView

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

请使用这个非常简单的方法(设置ID,单击监听器,然后将一个班级导航到另一个班级)
CHANDAN KUMAR

欢迎使用Stack Overflow!请不要只将您的源代码放在这里。保持友善,并尝试对您的答案给出一个很好的描述,以便其他人会喜欢并赞成。请参阅:我如何写一个好的答案?
sɐunıɔןɐqɐp

4
    val button = findViewById<Button>(R.id.button)
    button.setOnClickListener {
        val intent = 
    Intent(this@MainActivity,ThirdActivity::class.java)
        intent.putExtra("key", "Kotlin")
        startActivity(intent)
    }


3

一种简单的方法是注册一个点击监听器,并使用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
    }
}

2

有多种实现此目的的方法,如对该问题的回答多种所示。

要将侦听器实际分配给视图,请使用与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)



1

您可以在kotlin中使用类似onclickListener

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

1
findViewById<Button>(R.id.signUp)?.setOnClickListener(
    Toast.makeText(mActivity, "Button Clicked", Toast.LENGTH_LONG).show()
)

1

这是解决方案。您的代码将如下所示:

button.setOnClickListener {
            //your code here
        }

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

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

}

0

首先找到该按钮,以防止投射,View您可以使用<>,如下所示:

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

有了的实例之后Button,您现在可以按如下所示附加点击侦听器:

button.setOnClickListener {  
 // You code here
}

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

0

我知道最简单的方法是通过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()
    }
}

0

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

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

0

像这样在按钮上添加clickListener

    btUpdate.setOnClickListener(onclickListener)

在您的活动中添加此代码

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


        }
    }

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.