【发布时间】:2015-08-09 05:42:44
【问题描述】:
我想在可能活动的 Layout-XML 中为 EditText 定义一个 onClick 侦听器,但它总是失败并出现一个模糊的异常。
布局在我的活动的onCreate-Method 中注入setContentView()。我在这里不使用 Fragment,我很清楚定义的 XML onClick Listener 不适用于 Fragment。
出于测试目的,我向位于 EditText 旁边的 ImageView 添加了相同的处理程序方法。处理程序在那里工作,在 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)
我目前正在测试三星 S4 (Android 5.0.1) API 21 和版本 v7 22.1.0 中的 AppCompat 库
在onCreate 方法中以编程方式添加onClick 侦听器将是一个解决方案,但我想避免这种情况,因为它会导致单个onClick 方法带有一个大的switch 语句和基于XML 的onClick-处理程序会产生我更喜欢的更易读和更明确的代码。
进行了额外的研究:
现在我可以重现错误行为和正确行为(见下文)。看来这是 appcompat-v7 22.1.0 和 22.1.1 引入的错误(或功能)。
我使用带有空白活动的 Android Studio 创建了一个新项目。 minSdk 17,targetSdk 21。如下所示将EditText添加到空白Activity,并将处理程序方法添加到Activity,如下所示:
public void onCreationClicked(View view) {
Toast.makeText(this,"Event Handled",Toast.LENGTH_LONG).show();
}
启动 App 碰到了 EditText --> Crash
将我的 build.gradle 更改为:
compile 'com.android.support:appcompat-v7:22.1.1'
到
compile 'com.android.support:appcompat-v7:22.0.0'
并显示Toast。
有什么想法吗?
【问题讨论】:
-
我需要 EditText 上的 onClick 侦听器。删除它不是解决方案。
标签: android android-layout android-edittext android-event