Android - Як досягти setOnClickListener у Котліні?


101

Я хотів би знати, як ми встановлюємо базовий onClickListener у Котліні для розробки Android.


6
Як це питання може мати 43 голоси?
— Hugo Allexis Cardona

5
Це, мабуть, популярно, оскільки Android Studio перетворює Java на, button.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View) { /*do work*/} })а потім надає рекомендації щодо їх згенерованого коду про те, що ми повинні перетворити його на лямбда-звук.
— Джо Лапп,

6
Котлін - чортовий неінтуїтивний. Не маю уявлення, чому Google так багато вкладає у це
— codezombie

2
Чому всі публікують однакову відповідь із невеликою різницею? Відповідь проста view.setOnClickListener { ... }. Здається, кожен так прагне заробити репутацію.
— Азіз

Відповіді:


69

Припустимо, у вас є textView для клацання

text_view.text = "Hello Kotlin";

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

1
О так! Висновок типу бере на себе всі брудні шматочки. Дякую!
— Джо Лапп,

45

Використовуйте код нижче

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

Ось приклад того, як використовувати onClickListener у Kotlin

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

всі придивляються, "об'єкт", очевидно, не в фігурних дужках. я витратив частину часу
— М. Усман-хан

25

Спосіб 1:

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

Спосіб 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

Існує п’ять способів використання 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
            }
        }
    }
}

Ура!


15

Для використання кількох ідентифікаторів:

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 (скажімо Button, 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.

Оновлення

Тепер ви можете посилатися на кнопку безпосередньо з її ідентифікатором, включаючи наступний оператор імпорту у файл класу. Документація .

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

а потім для кнопки

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

Зверніться до підручника Android Studio .


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

Просто ви можете отримати OnClickListener у kotlin

view1.setOnClickListener{

//body 

}

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

будь ласка, використовуйте його дуже просто (встановіть ідентифікатор, клацніть слухач та перейдіть до одного класу до іншого класу)
— ЧАНДАН КУМАР

Ласкаво просимо до 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

Простим способом було б зареєструвати слухач клацання та створити слухач клацання з лямбда-виразом.

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
}

Ви можете замінити _іменем, якщо вам потрібен режим перегляду, щоб використовувати його. Наприклад, вам потрібно перевірити ідентифікатор прослуховувача кліків.

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

2

Існує кілька різних способів досягти цього, про що свідчить різноманітність відповідей на це питання.

Щоб насправді призначити слухача для подання, ви використовуєте ті самі методи, що і в Java:

button.setOnClickListener()

Однак Котлін полегшує призначення лямбди як слухача:

button.onSetClickListener {
    // Listener code
}

Крім того, якщо ви хочете використовувати цей прослуховувач для декількох подань, розгляньте лямбда-вираз (лямбда, призначена змінній / значенню для довідки):

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

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

2

Просто виконайте наведені нижче дії.

button.setOnClickListener{doSomething()}



1

Ви використовуєте подібний onclickListener у kotlin

val fab = findViewById(R.id.fab) as FloatingActionButton
fab.setOnClickListener {  
...
}


1

Ось рішення. Ваш код сподобається:

button.setOnClickListener {
            //your code here
        }

Не потрібно нічого додавати. як нижче:

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

}

0

Спочатку знайдіть кнопку, щоб уникнути акторського складу, Viewви можете використовувати <>наступне:

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

Після того, як у вас є екземпляр Button, тепер ви можете підключити прослуховувач кліків наступним чином:

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

Найпростіший спосіб досягти цього - за допомогою розширень Android від Kotlin.

У вашому додатку / 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

Якщо ви хочете імітувати старий анонімний спосіб у Котліні, я виявив, що це спрацювало чудово.

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


        }
    }

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.