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