Android - как добиться setOnClickListener в Kotlin?


104

Я хотел знать, как мы устанавливаем базовый onClickListener в Kotlin для разработки под Android.


6
Как за этот вопрос может проголосовать 43 человека?
Хьюго Аллексис Кардона

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

6
Котлин чертовски не интуитивен.
Понятия

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
О да! Вывод типа устраняет все беспорядочные биты. Спасибо!
Джо Лапп

46

Используйте код ниже

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

все присмотритесь, «объект» не в фигурных скобках, очевидно. я зря потратил часть своего времени
М. Усман Хан

26

Есть пять способов использовать 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
            }
        }
    }
}

Ура!


26

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

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. Можете ли вы мне помочь?
МашукХан

проверьте свои идентификаторы просмотра, убедитесь, что они существуют в xml файле.
Luvnish Monga

Они существуют в xml
MashukKhan

Поделитесь своим источником, включающим XML.
Luvnish Monga

6

Сначала вам нужно получить ссылку на представление (например, 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в Котлин

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

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

Добро пожаловать в 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()

Однако Kotlin позволяет легко назначить лямбду в качестве слушателя:

button.onSetClickListener {
    // Listener code
}

В качестве альтернативы, если вы хотите использовать этот прослушиватель для нескольких представлений, рассмотрите лямбда-выражение (лямбда, присвоенное переменной / значению для справки):

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

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



1

Вы так используете onclickListener в 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

Вот решение. Вашему коду понравится это:

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

Самый простой способ добиться этого - использовать 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

Если вы хотите смоделировать старый анонимный способ в Котлине, я обнаружил, что это отлично работает.

 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.