Android - จะบรรลุ setOnClickListener ใน Kotlin ได้อย่างไร


118

ฉันอยากรู้ว่าเราตั้งค่าพื้นฐานบนClickListenerใน Kotlin สำหรับการพัฒนา Android อย่างไร


5
อาจเป็นที่นิยมเนื่องจาก Android Studio แปลง Java เป็นbutton.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View) { /*do work*/} })แล้วให้คำแนะนำเกี่ยวกับโค้ดที่สร้างขึ้นซึ่งเราควรแปลงเป็นแลมบ์ดา
Joe Lapp

6
Kotlin ด่าโดยไม่เจตนา ไม่รู้ว่าทำไม Google ถึงลงทุนกับมันมาก
codezombie

3
ทำไมทุกคนจึงโพสต์คำตอบเดียวกันโดยมีข้อแตกต่างเล็กน้อย คำตอบนั้นง่ายview.setOnClickListener { ... }มาก ดูเหมือนว่าทุกคนต่างกระตือรือร้นที่จะได้รับชื่อเสียง
Aziz

คำตอบ:


74

สมมติว่าคุณมี textView ให้คลิก

text_view.text = "Hello Kotlin";

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

1
ใช่เลย! การอนุมานประเภทจะดูแลบิตที่ยุ่งเหยิงทั้งหมด ขอบคุณ!
Joe Lapp

49

ใช้โค้ดด้านล่าง

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

33

มีห้าวิธีในการใช้ SetOnClickListener:

อันดับแรก:

button.setOnClickListener {
    // Do some work here
}

ประการที่สอง:

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

})

ประการที่สาม:

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

ออกไป:

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

ประการที่ห้า:

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

ไชโย!


29

นี่คือตัวอย่างวิธีการใช้ onClickListener ใน Kotlin

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

ทั้งหมดดูใกล้ ๆ "วัตถุ" ไม่ได้อยู่ในวงเล็บปีกกาอย่างชัดเจน ฉันเสียเวลาไปพอสมควร
M. Usman Khan

28

วิธีที่ 1:

txtNext.setOnClickListener {
        //Code statements
    }

วิธีที่ 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
        }
    }
  }
}

16

สำหรับการใช้หลายรหัส:

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

สร้างคลาสที่ไม่ระบุชื่อ:

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

มันกำลังขว้าง nullPointerException ในกรณีของฉัน คุณช่วยฉันได้ไหม
MashukKhan

ตรวจสอบรหัสการดูของคุณตรวจสอบให้แน่ใจว่ามีไฟล์ xml อยู่
Luvnish Monga

มีอยู่ใน xml
MashukKhan

แบ่งปันแหล่งที่มาของคุณรวมถึง XML
Luvnish Monga

6

ก่อนอื่นคุณต้องได้รับการอ้างอิงถึง View (พูดปุ่ม TextView ฯลฯ ) และตั้งค่า OnClickListener เป็นข้อมูลอ้างอิงโดยใช้เมธอด 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()
}

อ้างอิงKotlin SetOnClickListener ตัวอย่างสำหรับตัวอย่าง Kotlin Android ที่สมบูรณ์ซึ่งมีปุ่มอยู่ในกิจกรรมและใช้ OnclickListener กับปุ่ม เมื่อคุณคลิกที่ปุ่มโค้ดภายในบล็อก SetOnClickListener จะถูกเรียกใช้งาน

อัปเดต

ตอนนี้คุณสามารถอ้างอิงปุ่มได้โดยตรงกับ id โดยรวมคำสั่งนำเข้าต่อไปนี้ในไฟล์ Class เอกสารประกอบ .

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

จากนั้นสำหรับปุ่ม

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

โปรดดูAndroid สตูดิโอสอน


5

ใช้รหัสนี้เพื่อเพิ่มonClickListenerใน 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

ฉันเห็นคำแนะนำมากมายที่นี่ แต่คอลเล็กชันนี้ไม่มีสิ่งต่อไปนี้

button.setOnClickListener(::onButtonClicked)

และในคลาสปัจจุบันเรามีวิธีการดังนี้:

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

5

var tv = findViewById(R.id.tv) เป็น TextView

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

โปรดใช้อันนี้ง่ายมาก (ตั้งค่า id คลิกฟังและนำทางคลาสหนึ่งไปยังคลาสอื่น)
CHANDAN KUMAR

ยินดีต้อนรับสู่ Stack Overflow! โปรดอย่าเพิ่งโยนซอร์สโค้ดของคุณที่นี่ เป็นคนดีและพยายามให้คำอธิบายที่ดีสำหรับคำตอบของคุณเพื่อให้คนอื่นชอบและโหวตให้คะแนน ดู: ฉันจะเขียนคำตอบที่ดีได้อย่างไร?
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

วิธีง่ายๆคือลงทะเบียน click listener และสร้าง click listener ด้วยนิพจน์แลมบ์ดา

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

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

และดำเนินการตามclickListener:

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

คุณสามารถแทนที่_ด้วยชื่อได้หากต้องการใช้มุมมองดังกล่าว ตัวอย่างเช่นคุณต้องตรวจสอบ id ของ click listener

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

2

มีหลายวิธีในการบรรลุเป้าหมายนี้ดังที่แสดงให้เห็นจากคำตอบที่หลากหลายสำหรับคำถามนี้

ในการกำหนดฟังก์ชั่นให้กับมุมมองคุณใช้วิธีการเดียวกับที่คุณทำใน Java:

button.setOnClickListener()

อย่างไรก็ตาม Kotlin ทำให้ง่ายต่อการกำหนด lambda ให้เป็นผู้ฟัง:

button.onSetClickListener {
    // Listener code
}

หรือหากคุณต้องการใช้ตัวฟังนี้สำหรับหลายมุมมองให้พิจารณานิพจน์แลมบ์ดา (แลมบ์ดาที่กำหนดให้กับตัวแปร / ค่าสำหรับการอ้างอิง):

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

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






0

ก่อนอื่นให้ค้นหาปุ่มเพื่อป้องกันไม่ให้นักแสดงViewคุณสามารถใช้สิ่ง<>ต่อไปนี้:

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

เมื่อคุณมีอินสแตนซ์Buttonแล้วคุณสามารถแนบตัวฟังคลิกได้ดังนี้:

button.setOnClickListener {  
 // You code here
}


0

วิธีที่ง่ายที่สุดที่ฉันรู้เพื่อให้บรรลุคือผ่าน Kotlin Android Extensions

บนแอปของคุณ / build.gradle

apply plugin: 'kotlin-android-extensions'

หากปุ่มของคุณเรียกว่า 'btnAdd' จากนั้นในส่วนหรือกิจกรรมของคุณจะนำเข้าสิ่งต่อไปนี้:

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

หากคุณต้องการจำลองวิธีการไม่ระบุตัวตนแบบเก่าใน Kotlin ฉันพบว่ามันทำงานได้อย่างสมบูรณ์แบบ

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

0

เพิ่ม clickListener บนปุ่มเช่นนี้

    btUpdate.setOnClickListener(onclickListener)

เพิ่มรหัสนี้ในกิจกรรมของคุณ

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


        }
    }

0

เพิ่มในไฟล์โมดูล build.gradle

android {
    ...
    buildFeatures {
        viewBinding true
    }
}

สำหรับกิจกรรมเพิ่ม

private lateinit var binding: ResultProfileBinding
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ResultProfileBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)
}

เพิ่มเมื่อคลิก

binding.button.setOnClickListener { Log.d("TAG", "Example") }

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.