Как ссылаться на метод внутри нажатия кнопки - PullRequest
0 голосов
/ 09 июля 2019

Я учу котлин. Я установил обработчик нажатия кнопки в XML, как показано ниже в коде. Когда кнопка нажата, я вызываю метод beginSearch (), но затем происходит сбой приложения, и я получаю опубликованное ниже ошибка.

пожалуйста, дайте мне знать, как исправить эту ошибку.

Активность

private fun clickHandler(v : View?) : Unit {

    when(v?.id) {
        R.id.btnCheckSearchResult -> beginSearch("Trump")
    }
}

кнопка :

<Button
        android:id="@+id/btnCheckSearchResult"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Check Search Result"
        android:layout_below="@id/etSearchEntry"
        android:onClick="clickHandler"/>

ошибка

    --------- beginning of crash
    2019-07-09 15:02:06.146 14883-14883/com.example.retrofitkotlin_v10 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.retrofitkotlin_v10, PID: 14883
    java.lang.IllegalStateException: Could not find method clickHandler(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton with id 'btnCheckSearchResult'
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:424)
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:381)
    at android.view.View.performClick(View.java:6256)
    at android.view.View$PerformClick.run(View.java:24701)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

Ответы [ 4 ]

2 голосов
/ 09 июля 2019

Просто используйте

btnCheckSearchResult.setOnClickListener {
              beginSearch("Trump")
            }

или

btnCheckSearchResult.setOnClickListener({
            beginSearch("Trump")
        })
2 голосов
/ 09 июля 2019

Функция должна быть открытой (или защищенной).

public fun clickHandler(v : View?) : Unit {

    when(v?.id) {
        R.id.btnCheckSearchResult -> beginSearch("Trump")
    }
}

P.S. Вы также можете использовать setOnClickListener, как указали другие ответы.

2 голосов
/ 09 июля 2019

java.lang.IllegalStateException: не удалось найти метод clickHandler (View) в контексте родителя или предка для Android: onClick атрибут, определенный в классе представления android.support.v7.widget.AppCompatButton с идентификатором 'BtnCheckSearchResult'

Удалить android:onClick="clickHandler" из XML

И попробуйте с

btnCheckSearchResult.setOnClickListener {
              beginSearch("Trump")
            }

И

import kotlinx.android.synthetic.main.your_layout.*
1 голос
/ 09 июля 2019

сделай свою функцию public

public fun clickHandler(v : View?) : Unit {

    when(v?.id) {
        R.id.btnCheckSearchResult -> beginSearch("Trump")
    }
}
...