Android - jak osiągnąć setOnClickListener w Kotlinie?


104

Chciałem wiedzieć, jak ustawiliśmy podstawowy onClickListener w Kotlin dla Android Development.


6
Jak to pytanie może mieć 43 głosy?
Hugo Allexis Cardona

5
Prawdopodobnie jest popularne, ponieważ Android Studio konwertuje Javę na, button.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View) { /*do work*/} })a następnie dostarcza porady na temat wygenerowanego przez nich kodu, że powinniśmy przekonwertować go na lambdę.
Joe Lapp

6
Kotlin jest cholernie nieintuicyjny. Nie mam pojęcia, dlaczego Google tak dużo w to
inwestuje

2
Dlaczego wszyscy publikują tę samą odpowiedź z niewielką różnicą? Odpowiedź jest prosta view.setOnClickListener { ... }. Wygląda na to, że wszyscy tak bardzo chcą zdobyć reputację.
Aziz

Odpowiedzi:


69

Załóżmy, że masz textView do kliknięcia

text_view.text = "Hello Kotlin";

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

1
O tak! Wnioskowanie o typie usuwa wszystkie niechlujne bity. Dzięki!
Joe Lapp

46

Użyj poniższego kodu

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

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

kod clickListener .

val clickListener = View.OnClickListener {view ->

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

28

Oto przykład, jak używać onClickListener w Kotlinie

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

wszyscy wyglądają blisko, "obiekt" nie jest oczywiście w nawiasach klamrowych. straciłem trochę czasu
M. Usman Khan

26

Istnieje pięć sposobów korzystania z SetOnClickListener:

Pierwszy:

button.setOnClickListener {
    // Do some work here
}

Druga:

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

})

Trzeci:

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

Naprzód:

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

Piąty:

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

Twoje zdrowie!


26

Metoda 1:

txtNext.setOnClickListener {
        //Code statements
    }

Metoda 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

Aby użyć wielu identyfikatorów:

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

Utwórz zajęcia anonimowe:

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

W moim przypadku rzuca nullPointerException. Czy możesz mi pomóc
MashukKhan

sprawdź identyfikatory widoku, upewnij się, że istnieją pliki xml.
Luvnish Monga

Istnieją w xml
MashukKhan,

Udostępnij swoje źródło zawiera XML.
Luvnish Monga

6

Najpierw musisz pobrać odwołanie do widoku (powiedzmy Button, TextView itp.) I ustawić OnClickListener na referencję za pomocą metody 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()
}

Zapoznaj się z przykładem Kotlin SetOnClickListener, aby uzyskać pełny przykład Kotlin Android, w którym przycisk jest obecny w działaniu, a OnclickListener jest stosowany do przycisku. Po kliknięciu przycisku wykonywany jest kod wewnątrz bloku SetOnClickListener.

Aktualizacja

Teraz możesz odwołać się do przycisku bezpośrednio za pomocą jego identyfikatora, dołączając następującą instrukcję importu do pliku klasy. Dokumentacja .

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

a następnie przycisk

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

Zapoznaj się z samouczkiem Android Studio .


5

Użyj tego kodu, aby dodać 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

Po prostu możesz uzyskać OnClickListener w kotlin

view1.setOnClickListener{

//body 

}

5

Widzę tutaj wiele sugestii, ale w tej kolekcji brakuje następujących.

button.setOnClickListener(::onButtonClicked)

aw obecnej klasie mamy taką metodę:

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

5

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

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

użyj tego bardzo prostego (ustaw identyfikator, słuchacz kliknięć i przejdź z jednej klasy do innej)
CHANDAN KUMAR

Witamy w Stack Overflow! Proszę nie wrzucaj tutaj swojego kodu źródłowego. Bądź miły i staraj się dobrze opisać swoją odpowiedź, aby inni ją polubili i pozytywnie ocenili. Zobacz: Jak napisać dobrą odpowiedź?
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

Prostym sposobem byłoby zarejestrowanie nasłuchiwania kliknięć i utworzenie nasłuchiwania kliknięć z wyrażeniem lambda.

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

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

I wdrożyć clickListener:

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

Możesz zastąpić _nazwę, jeśli chcesz, aby widok jej używał. Na przykład musisz sprawdzić identyfikator odbiornika kliknięć.

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

2

Można to osiągnąć na kilka różnych sposobów, o czym świadczą różnorodne odpowiedzi na to pytanie.

Aby faktycznie przypisać odbiornik do widoku, użyj tych samych metod, co w Javie:

button.setOnClickListener()

Jednak Kotlin ułatwia przypisanie lambdy jako słuchacza:

button.onSetClickListener {
    // Listener code
}

Alternatywnie, jeśli chcesz używać tego detektora do wielu widoków, rozważ wyrażenie lambda (lambda przypisane do zmiennej / wartości w celach informacyjnych):

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

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

2

Po prostu wykonaj poniższe czynności:

button.setOnClickListener{doSomething()}



1

Używasz w ten sposób onclickListener w 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

Oto rozwiązanie. Twój kod będzie wyglądał tak:

button.setOnClickListener {
            //your code here
        }

Nie musisz niczego dodawać. jak poniżej:

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

}

0

Najpierw znajdź przycisk, aby zapobiec rzucaniu z niego View, możesz użyć w <>następujący sposób:

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

Gdy masz już instancję Button, możesz teraz dołączyć odbiornik kliknięć w następujący sposób:

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

Najłatwiejszym sposobem, jaki znam, aby to osiągnąć, są rozszerzenia Kotlin dla Androida.

W twojej aplikacji / build.gradle

apply plugin: 'kotlin-android-extensions'

Jeśli twój przycisk nazywa się `` btnAdd '', to w swoim fragmencie lub działaniu zaimportuj następujące elementy:

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

Jeśli chcesz zasymulować stary anonimowy sposób w Kotlinie, okazało się, że działa to idealnie.

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

0

Dodaj funkcję clickListener do takiego przycisku

    btUpdate.setOnClickListener(onclickListener)

dodaj ten kod do swojej aktywności

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


        }
    }

-1

Możesz użyć setOnClickListener w ten sposób w Kotlin

button.setOnClickListener(View.OnClickListener {        
       //code
})
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.