Android EditText onClick Слушатель, определенный в Layout, завершается с неясным исключением

Я хочу определить прослушиватель onClick для EditText в Layout-XML майской активности, но он всегда завершается с неясным исключением.

Макет вводится с setContentView() в onCreate -Метод моей деятельности. Я не использую Фрагмент здесь, и я хорошо знаю, что XML определил onClick Слушатель не работает на фрагменты.

В целях тестирования я добавил тот же метод-обработчик в ImageView, который расположен рядом с EditText. Там обработчик работает, на EditText он не работает. Так что это что-то особенное в EditText, а не общая проблема неправильного метода обработки.

Это соответствующая часть моего файла макета:

<ImageView
     android:layout_gravity="center_horizontal|top"
     android:layout_rowSpan="3"
     android:src="@drawable/ic_action_event"
     android:onClick="onCreationClicked"
     />

<EditText
     android:id="@+id/creation_edit"
     android:focusable="false"
     android:clickable="true"
     android:layout_gravity="fill_horizontal"
     android:hint="@string/enter_creation"
     android:onClick="onCreationClicked"
     style="@style/PickerEditText"
     />

Когда я нажимаю на ImageView, выполняется связанный метод и запускается DialogFragment. Когда я нажимаю на EditText, я получаю следующее исключение:

    java.lang.IllegalStateException: Could not find a method onCreationClicked(View) in the activity class android.support.v7.internal.widget.TintContextWrapper for onClick handler on view class android.support.v7.widget.AppCompatEditText with id 'creation_edit'
            at android.view.View$1.onClick(View.java:3994)
            at android.view.View.performClick(View.java:4756)
            at android.view.View$PerformClick.run(View.java:19749)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
     Caused by: java.lang.NoSuchMethodException: onCreationClicked [class android.view.View]
            at java.lang.Class.getMethod(Class.java:664)
            at java.lang.Class.getMethod(Class.java:643)
            at android.view.View$1.onClick(View.java:3987)
            at android.view.View.performClick(View.java:4756)
            at android.view.View$PerformClick.run(View.java:19749)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

В настоящее время я тестирую на Samsung S4 (Android 5.0.1) API 21 и AppCompat Library в версии v7 22.1.0

Добавление onClick Слушатель программно в onCreate Метод будет решением, но я хотел бы избежать этого, так как это приводит к единому onClick метод с большим оператором switch и основанный на XML метод onClick-Handler приводят к более читаемому и явному коду, который я предпочитаю.

Провел дополнительное исследование:

Теперь я могу воспроизвести поведение ошибки и правильное поведение (см. Ниже). Кажется, что это ошибка (или функция), представленная в appcompat-v7 22.1.0 и 22.1.1.

Я создал новый свежий проект с Android Studio с Blank Activity. minSdk 17, targetSdk 21. Добавлен EditText в пустую Activity как показано ниже, и добавил метод-обработчик к Activity как это:

public void onCreationClicked(View view) {
    Toast.makeText(this,"Event Handled",Toast.LENGTH_LONG).show();
}

Запустил приложение коснулся EditText -> Crash

Изменил мой build.gradle из:

    compile 'com.android.support:appcompat-v7:22.1.1'

в

    compile 'com.android.support:appcompat-v7:22.0.0'

и Toast Показано.

Есть идеи?

3 ответа

Решение

Может быть, это помогает другим сэкономить время с поиском решения. Я поднял проблему для appcompat7, которая была принята со следующим комментарием:

Это уже исправлено в следующем выпуске платформы, но это может быть неосуществимо в appcompat.

Подробности: https://code.google.com/p/android/issues/detail?id=174871

Так что, действительно, это ошибка / проблема appcompat, и я вернусь к программному добавлению слушателя onClick.

Вам нужно определить метод onCreationClicked(View) в вашем Activity не в вашем Fragment, Если вы хотите Fragment чтобы обработать клик, вам нужно удалить onClick в вашем XML и обработать слушателя программно.

Я использовал следующий совет из № 5 в выпуске 174871:

менять:<EditText .../> в <android.widget.EditText .../>

Так что Appcompat больше не обрабатывает onClick

Другие вопросы по тегам