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

104

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

Anirudh Agarwal
źródło
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)
}
Vinod Pattanshetti
źródło
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()
    }
}
Akash Patel
źródło
28

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

button1.setOnClickListener(object : View.OnClickListener{
            override fun onClick(v: View?) {
                //Your code here
            }})
Alf Moh
źródło
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!

Naimatullah
źródło
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
        }
    }
  }
}
Ronak Thakkar
źródło
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()
        }
    }
}
Luvnish Monga
źródło
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 .

Mallikarjun M
źródło
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()
    }
}
ambreesh kushwaha
źródło
5

Po prostu możesz uzyskać OnClickListener w kotlin

view1.setOnClickListener{

//body 

}
Android Geek
źródło
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
}
hadilq
źródło
5

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

    tv.setOnClickListener {
       val i = Intent(this@MainActivity, SecondActivity::class.java)
       startActivity(i)
       finish()
    }
CHANDAN KUMAR
źródło
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)
    }
Vinay John
źródło
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
źródło
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
    }
}
Maihan Nijat
źródło
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)
RedBassett
źródło
2

Po prostu wykonaj poniższe czynności:

button.setOnClickListener{doSomething()}

Kishan V
źródło
2
   button.setOnClickListener {
          //write your code here
   }
Resmi Venugopal
źródło
Ta odpowiedź jest taka sama, jak wcześniejsze.
Pochmurnik
1

Używasz w ten sposób onclickListener w kotlin

val fab = findViewById(R.id.fab) as FloatingActionButton
fab.setOnClickListener {  
...
}
Shivam Sharma
źródło
1
findViewById<Button>(R.id.signUp)?.setOnClickListener(
    Toast.makeText(mActivity, "Button Clicked", Toast.LENGTH_LONG).show()
)
user3694157
źródło
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 {

}
Faxriddin Abdullayev
źródło
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
}
Józef
źródło
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
źródło
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()
    }
}
isijara
źródło
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!
    }})
user2288580
źródło
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()


        }
    }
Jyot
źródło
-1

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

button.setOnClickListener(View.OnClickListener {        
       //code
})
Marium Jawed
źródło