Android - Come ottenere setOnClickListener in Kotlin?


101

Volevo sapere come abbiamo impostato la funzione di base su ClickListener in Kotlin per lo sviluppo Android.


6
Come può questa domanda avere 43 voti?
Hugo Allexis Cardona

5
Probabilmente è popolare perché Android Studio converte il Java in button.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View) { /*do work*/} })e quindi fornisce un avviso sul codice generato che dovremmo convertirlo in un lambda.
Joe Lapp

6
Kotlin è dannatamente poco intuitivo. Non
ho

2
Perché tutti pubblicano la stessa risposta con una leggera differenza? La risposta è semplice view.setOnClickListener { ... }. Sembra che tutti siano così ansiosi di guadagnarsi la reputazione.
Aziz

Risposte:


69

Supponiamo di avere textView su cui fare clic

text_view.text = "Hello Kotlin";

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

1
O si! L'inferenza del tipo si prende cura di tutti i bit disordinati. Grazie!
Joe Lapp

45

Usa il codice sottostante

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

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

codice clickListener .

val clickListener = View.OnClickListener {view ->

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

28

Ecco un esempio su come utilizzare onClickListener in Kotlin

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

tutti guardano da vicino, l '"oggetto" non è tra parentesi graffe, ovviamente. Ho perso un po 'del mio tempo
M. Usman Khan

25

Metodo 1:

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

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

24

Ci sono cinque modi per usare SetOnClickListener:

Primo:

button.setOnClickListener {
    // Do some work here
}

Secondo:

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

})

Terzo:

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

Via:

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

Saluti!


15

Per l'utilizzo di più ID:

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

Crea classe anonima:

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

Sta lanciando nullPointerException nel mio caso. Potete aiutarmi
MashukKhan

controlla i tuoi ID di visualizzazione, assicurati che esistano file xml.
Luvnish Monga,

Esistono in xml
MashukKhan

Condividi la tua fonte include XML.
Luvnish Monga

6

Per prima cosa devi ottenere il riferimento alla vista (ad esempio Button, TextView, ecc.) E impostare un OnClickListener sul riferimento utilizzando il metodo 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()
}

Fare riferimento all'esempio di Kotlin SetOnClickListener per l' completo di Kotlin Android in cui un pulsante è presente in un'attività e OnclickListener è applicato al pulsante. Quando si fa clic sul pulsante, viene eseguito il codice all'interno del blocco SetOnClickListener.

Aggiornare

Ora puoi fare riferimento al pulsante direttamente con il suo id includendo la seguente dichiarazione di importazione nel file Class. Documentazione .

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

e poi per il pulsante

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

Fare riferimento al tutorial di Android Studio .


5

Usa questo codice per aggiungere onClickListenerin 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()
    }
}

5

Semplicemente puoi ottenere OnClickListener in kotlin

view1.setOnClickListener{

//body 

}

5

Vedo molti suggerimenti qui, ma questa raccolta manca di quanto segue.

button.setOnClickListener(::onButtonClicked)

e nella classe corrente abbiamo un metodo come questo:

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

5

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

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

per favore usa questo molto semplice (imposta l'ID, fai clic sull'ascoltatore e passa da una classe a un'altra)
CHANDAN KUMAR

Benvenuto in Stack Overflow! Per favore, non buttare qui il tuo codice sorgente. Sii gentile e cerca di dare una bella descrizione alla tua risposta, in modo che gli altri la apprezzino e la votino. Vedi: come scrivo una buona risposta?
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
**i have use kotlin-extension so i can access directly by button id:**


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

                    hitApiLogin()
                }
            }
        }

3

Un modo semplice sarebbe registrare un listener di clic e creare un listener di clic con un'espressione lambda.

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

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

E implementa clickListener:

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

Puoi sostituire _con un nome se hai bisogno della vista per usarlo. Ad esempio, devi controllare l'id del click listener.

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

2

Esistono diversi modi per ottenere ciò, come dimostrato dalla varietà di risposte a questa domanda.

Per assegnare effettivamente l'ascoltatore alla vista, usi gli stessi metodi che faresti in Java:

button.setOnClickListener()

Tuttavia, Kotlin semplifica l'assegnazione di un lambda come ascoltatore:

button.onSetClickListener {
    // Listener code
}

In alternativa, se desideri utilizzare questo listener per più visualizzazioni, considera un'espressione lambda (un'espressione lambda assegnata a una variabile / valore per riferimento):

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

button.setOnClickListener(buttonClickListener)
another_button.setOnClickListener(buttonClickListener)

2

Fai semplicemente come di seguito:

button.setOnClickListener{doSomething()}



1

Usi così onclickListener in kotlin

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

Ecco la soluzione. Il tuo codice sarà così:

button.setOnClickListener {
            //your code here
        }

Non c'è bisogno di aggiungere nulla. come sotto:

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

}

0

Per prima cosa trova il pulsante, per evitare che il cast venga Viewutilizzato <>come segue:

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

Una volta che hai un'istanza di Button, ora puoi allegare il listener di clic come segue:

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

Il modo più semplice che conosco per ottenerlo è tramite le estensioni Android di Kotlin.

Nella tua app / build.gradle

apply plugin: 'kotlin-android-extensions'

Se il pulsante si chiama "btnAdd", sul frammento o sull'attività importa quanto segue:

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

Se vuoi simulare il vecchio modo anonimo in Kotlin, ho trovato che funzionava perfettamente.

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

0

Aggiungi clickListener su un pulsante come questo

    btUpdate.setOnClickListener(onclickListener)

aggiungi questo codice nella tua attività

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


        }
    }

-1

Puoi usare setOnClickListener in questo modo in Kotlin

button.setOnClickListener(View.OnClickListener {        
       //code
})
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.