Android - Làm thế nào để đạt được setOnClickListener trong Kotlin?


101

Tôi muốn biết rằng cách chúng tôi thiết lập onClickListener cơ bản trong Kotlin dành cho Phát triển Android.


6
Làm thế nào để câu hỏi này có 43 phiếu bầu?
Hugo Allexis Cardona

5
Nó có lẽ phổ biến vì Android Studio chuyển đổi Java sang button.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View) { /*do work*/} })và sau đó cung cấp lời khuyên về mã được tạo của họ mà chúng tôi nên chuyển đổi nó thành lambda.
Joe Lapp

6
Kotlin thật không trực quan. Không hiểu tại sao Google lại đầu tư rất nhiều vào nó
codezombie

2
Tại sao tất cả mọi người đều đăng cùng một câu trả lời với sự khác biệt nhỏ? Câu trả lời là đơn giản view.setOnClickListener { ... }. Có vẻ như mọi người đều rất mong muốn kiếm được danh tiếng.
Aziz

Câu trả lời:


69

Giả sử bạn có textView để nhấp

text_view.text = "Hello Kotlin";

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

1
Ồ đúng vậy! Kiểu suy luận sẽ xử lý tất cả các bit lộn xộn. Cảm ơn!
Joe Lapp

45

Sử dụng mã bên dưới

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

Đây là một ví dụ về cách sử dụng onClickListener trong Kotlin

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

tất cả đều nhìn gần, "đối tượng" rõ ràng là Không nằm trong dấu ngoặc nhọn. tôi đã lãng phí một chút thời gian của mình
M. Usman Khan

25

Phương pháp 1:

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

Phương pháp 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

Có năm cách để sử dụng SetOnClickListener:

Đầu tiên:

button.setOnClickListener {
    // Do some work here
}

Thứ hai:

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

})

Ngày thứ ba:

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

Forth:

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

Thứ năm:

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

Chúc mừng!


15

Để sử dụng nhiều id:

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

Tạo lớp ẩn danh:

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

Nó đang ném nullPointerException trong trường hợp của tôi. Bạn có thể giúp tôi không
MashukKhan 21/11/19

kiểm tra id chế độ xem của bạn, đảm bảo rằng chúng tồn tại tệp xml.
Luvnish Monga

Họ tồn tại trong xml
MashukKhan

Chia sẻ nguồn của bạn bao gồm XML.
Luvnish Monga

6

Đầu tiên, bạn phải lấy tham chiếu đến Chế độ xem (ví dụ: Nút, TextView, v.v.) và đặt OnClickListener thành tham chiếu bằng phương thức 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()
}

Tham khảo Ví dụ về Kotlin SetOnClickListener để biết Ví dụ về Kotlin Android hoàn chỉnh trong đó một nút hiện diện trong một hoạt động và OnclickListener được áp dụng cho nút. Khi bạn nhấp vào nút, mã bên trong khối SetOnClickListener được thực thi.

Cập nhật

Bây giờ bạn có thể tham chiếu trực tiếp nút với id của nó bằng cách đưa câu lệnh nhập sau vào tệp Lớp. Tài liệu .

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

và sau đó cho nút

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

Tham khảo Hướng dẫn Android Studio .


5

Sử dụng mã này để thêm onClickListenervào 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

Đơn giản là bạn có thể tải OnClickListener trong kotlin

view1.setOnClickListener{

//body 

}

5

Tôi thấy rất nhiều gợi ý ở đây, nhưng bộ sưu tập này còn thiếu phần sau.

button.setOnClickListener(::onButtonClicked)

và trong lớp hiện tại, chúng ta có một phương thức như sau:

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

5

var tv = findViewById(R.id.tv) dưới dạng TextView

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

xin vui lòng sử dụng này rất dễ dàng (set id, bấm nghe và lớp một điều hướng đến lớp khác)
Chandan KUMAR

Chào mừng bạn đến với Stack Overflow! Vui lòng không chỉ ném mã nguồn của bạn ở đây. Hãy tử tế và cố gắng đưa ra một mô tả hay ho cho câu trả lời của bạn, để những người khác sẽ thích nó và tán thành nó. Xem: Làm thế nào để viết một câu trả lời tốt?
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

Một cách đơn giản là đăng ký trình nghe nhấp chuột và tạo trình nghe nhấp chuột với biểu thức lambda.

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

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

Và thực hiện clickListener:

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

Bạn có thể thay thế _bằng tên nếu bạn cần chế độ xem để sử dụng nó. Ví dụ: bạn cần kiểm tra id của trình nghe nhấp chuột.

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

2

Có một số cách khác nhau để đạt được điều này, thể hiện qua nhiều câu trả lời cho câu hỏi này.

Để thực sự chỉ định trình nghe cho dạng xem, bạn sử dụng các phương pháp tương tự như bạn làm trong Java:

button.setOnClickListener()

Tuy nhiên, Kotlin giúp bạn dễ dàng chỉ định lambda làm trình nghe:

button.onSetClickListener {
    // Listener code
}

Ngoài ra, nếu bạn muốn sử dụng trình nghe này cho nhiều chế độ xem, hãy xem xét biểu thức lambda (lambda được gán cho một biến / giá trị để tham chiếu):

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

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

2

Đơn giản chỉ cần làm như sau:

button.setOnClickListener{doSomething()}



1

Bạn sử dụng onclickListener như vậy trong 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

Đây là giải pháp. Mã của bạn sẽ như thế này:

button.setOnClickListener {
            //your code here
        }

Không cần thêm bất cứ điều gì. như dưới đây:

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

}

0

Trước tiên, hãy tìm nút, để ngăn quá trình truyền từ Viewbạn có thể sử dụng <>như sau:

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

Sau khi bạn có một phiên bản của Button, bây giờ bạn có thể đính kèm trình nghe nhấp chuột như sau:

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

Cách dễ nhất mà tôi biết để đạt được điều đó là thông qua Tiện ích mở rộng Android Kotlin.

Trên app / build.gradle của bạn

apply plugin: 'kotlin-android-extensions'

Nếu nút của bạn được gọi là 'btnAdd', thì trên phân đoạn hoặc hoạt động của bạn, hãy nhập thông tin sau:

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

Nếu bạn muốn mô phỏng cách ẩn danh cũ trong Kotlin, tôi thấy cách này hoạt động hoàn hảo.

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

0

Thêm clickListener vào nút như thế này

    btUpdate.setOnClickListener(onclickListener)

thêm mã này vào hoạt động của bạn

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


        }
    }

-1

Bạn có thể sử dụng setOnClickListener như thế này trong Kotlin

button.setOnClickListener(View.OnClickListener {        
       //code
})
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.