Android - como obter setOnClickListener em Kotlin?

101

Eu queria saber como definimos onClickListener básico no Kotlin para Android Development.

Anirudh Agarwal
fonte
6
Como essa questão pode ter 43 votos?
Hugo Allexis Cardona
5
Provavelmente é popular porque o Android Studio converte o Java para button.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View) { /*do work*/} })e, em seguida, fornece um aviso sobre o código gerado de que devemos convertê-lo em lambda.
Joe Lapp
6
Kotlin não é intuitivo. Não
faço
2
Por que todos estão postando a mesma resposta com uma pequena diferença? A resposta é simples view.setOnClickListener { ... }. Parece que todos estão ansiosos para ganhar reputação.
Aziz de

Respostas:

69

Suponha que você tenha textView para clicar

text_view.text = "Hello Kotlin";

text_view.setOnClickListener {
    val intent = Intent(this@MainActivity, SecondActivity::class.java)
    intent.putExtra("key", "Kotlin")
    startActivity(intent)
}
Vinod Pattanshetti
fonte
1
Oh sim! A inferência de tipo elimina todos os bits complicados. Obrigado!
Joe Lapp
45

Use o código abaixo

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

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

código clickListener .

val clickListener = View.OnClickListener {view ->

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

Aqui está um exemplo de como usar o onClickListener em Kotlin

button1.setOnClickListener(object : View.OnClickListener{
            override fun onClick(v: View?) {
                //Your code here
            }})
Alf Moh
fonte
todos parecem próximos, o "objeto" não está entre colchetes, obviamente. eu perdi um pouco do meu tempo
M. Usman Khan
25

Método 1:

txtNext.setOnClickListener {
        val intent = Intent(applicationContext, SecondActivity::class.java)
        startActivity(intent)
    }

Método 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 -> {
            val intent = Intent(applicationContext, SecondActivity::class.java)
            startActivity(intent)
        }
        else -> {
            // else condition
        }
    }
  }
}
Ronak Thakkar
fonte
24

Existem cinco maneiras de usar SetOnClickListener:

Primeiro:

button.setOnClickListener {
    // Do some work here
}

Segundo:

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

})

Terceiro:

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

Adiante:

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

Quinto:

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

Felicidades!

Naimatullah
fonte
15

Para usar vários IDs:

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

Crie uma classe anônima:

 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()
        }
    }
}
Luvnish Monga
fonte
Ele está jogando nullPointerException no meu caso. Você pode me ajudar
MashukKhan
verifique seus ids de visualização, certifique-se de que eles existam no arquivo xml.
Luvnish Monga
Eles existem em xml
MashukKhan
Compartilhe sua fonte inclui XML.
Luvnish Monga
6

Primeiro você tem que obter a referência para a Visualização (digamos, Button, TextView, etc.) e definir um OnClickListener para a referência usando o método setOnClickListener ()

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

Consulte o Exemplo SetOnClickListener de Kotlin para obter o Exemplo Android completo do Kotlin em que um botão está presente em uma atividade e OnclickListener é aplicado ao botão. Ao clicar no botão, o código dentro do bloco SetOnClickListener é executado.

Atualizar

Agora você pode fazer referência ao botão diretamente com seu id, incluindo a seguinte instrução de importação no arquivo de classe. Documentação .

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

e então para o botão

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

Consulte o tutorial do Android Studio .

Mallikarjun M
fonte
5

Use este código para adicionar onClickListenerem Kotlin

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()
    }
}
Ambreesh Kushwaha
fonte
5

Simplesmente você pode obter OnClickListener em kotlin

view1.setOnClickListener{

//body 

}
Android Geek
fonte
5

Vejo muitas sugestões aqui, mas esta coleção não contém o seguinte.

button.setOnClickListener(::onButtonClicked)

e na classe atual temos um método como este:

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

var tv = findViewById(R.id.tv) como TextView

    tv.setOnClickListener {
       val i = Intent(this@MainActivity, SecondActivity::class.java)
       startActivity(i)
       finish()
    }
CHANDAN KUMAR
fonte
por favor use este muito fácil (definir id, clicar em ouvinte e navegar de uma classe para outra)
CHANDAN KUMAR
Bem-vindo ao Stack Overflow! Por favor, não jogue apenas seu código-fonte aqui. Seja simpático e tente dar uma boa descrição à sua resposta, para que os outros gostem e votem positivamente. Veja: Como escrevo uma boa resposta?
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)
    }
Vinay john
fonte
3
**i have use kotlin-extension so i can access directly by button id:**


btnSignIN.setOnClickListener {
            if (AppUtils.isNetworkAvailable(activity as BaseActivity)) {
                if (checkValidation()) {

                    hitApiLogin()
                }
            }
        }
abhilasha Yadav
fonte
3

Uma maneira simples seria registrar um ouvinte de clique e criar um ouvinte de clique com uma expressão lambda.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // click listener registered
    myButton.setOnClickListener(clickListener)
}

E implementar o clickListener:

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

Você pode substituir _por um nome se precisar da visualização para usá-lo. Por exemplo, você precisa verificar a id do ouvinte de clique.

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

Existem várias maneiras de fazer isso, conforme demonstrado pela variedade de respostas a essa pergunta.

Para realmente atribuir o ouvinte à visualização, você usa os mesmos métodos que usaria em Java:

button.setOnClickListener()

No entanto, o Kotlin facilita a atribuição de um lambda como ouvinte:

button.onSetClickListener {
    // Listener code
}

Como alternativa, se você quiser usar este ouvinte para várias visualizações, considere uma expressão lambda (um lambda atribuído a uma variável / valor para referência):

val buttonClickListener = View.OnClickListener { view ->
    // Listener code
}

button.setOnClickListener(buttonClickListener)
another_button.setOnClickListener(buttonClickListener)
RedBassett
fonte
2

Basta fazer o seguinte:

button.setOnClickListener{doSomething()}

Kishan V
fonte
2
   button.setOnClickListener {
          //write your code here
   }
Resmi Venugopal
fonte
Esta resposta é igual às anteriores.
Pochmurnik
1

Você usa assim onclickListener em kotlin

val fab = findViewById(R.id.fab) as FloatingActionButton
fab.setOnClickListener {  
...
}
Shivam Sharma
fonte
1
findViewById<Button>(R.id.signUp)?.setOnClickListener(
    Toast.makeText(mActivity, "Button Clicked", Toast.LENGTH_LONG).show()
)
user3694157
fonte
1

Aqui está a solução. Seu código será assim:

button.setOnClickListener {
            //your code here
        }

Não há necessidade de adicionar nada. como abaixo:

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

}
Faxriddin Abdullayev
fonte
0

Primeiro encontre o botão, para evitar que a transmissão do, Viewvocê pode usar o da <>seguinte maneira:

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

Depois de ter uma instância de Button, agora você pode anexar o ouvinte de clique da seguinte maneira:

button.setOnClickListener {  
 // You code here
}
Joseph
fonte
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
}
Ajay Prajapati
fonte
0

A maneira mais fácil que conheço de conseguir isso é por meio das extensões Kotlin Android.

Em seu app / build.gradle

apply plugin: 'kotlin-android-extensions'

Se o seu botão se chamar 'btnAdd', no seu fragmento ou atividade importe o seguinte:

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()
    }
}
Isijara
fonte
0

Se você quiser simular a velha forma anônima em Kotlin, achei que funcionou perfeitamente.

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

Adicionar clickListener em um botão como este

    btUpdate.setOnClickListener(onclickListener)

adicione este código em sua atividade

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


        }
    }
Jyot
fonte
-1

Você pode usar setOnClickListener assim no Kotlin

button.setOnClickListener(View.OnClickListener {        
       //code
})
Marium Jawed
fonte