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.