【问题标题】:Android EditText onClick Listener defined in Layout fails with obscure Exception布局中定义的 Android EditText onClick 侦听器失败并出现模糊异常
【发布时间】: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


【解决方案1】:

您需要在Activity 中而不是在Fragment 中定义方法onCreationClicked(View)。如果您希望 Fragment 处理点击,您需要删除 XML 中的 onClick 并以编程方式处理侦听器。

【讨论】:

  • 布局文件与一个activity相关联,onCreatíonClicked在Activity中实现。出于测试目的,我向 ImageView 添加了相同的处理程序。它在那里工作,但我想把它放在 EditText 而不是 ImageView 上。我在这里使用 Fragment 的唯一一点是“onCreationClicked”处理程序启动 DialogFragment。
  • 您在“EditText”中测试“onclick”时是否删除了“ImageView”的“onclick”?也许使用相同的方法名称是 pb。
  • 为什么不在你的 onCreate() 方法中膨胀 EditText 并应用 setOnClickListener 呢?
  • ImageView 的 onClick 只是为了测试而添加的,因为 EditText 中的 onclick 不起作用。通过setOnClickListener 添加一个侦听器将是一个解决方案,但是我将有1 个onClick 侦听器方法和一个大的switch 语句,因为我的活动中有多个可点击控件并且我想避免这种情况,因为命名为@ 987654329@-Handlers 是可读性更好的方法。
  • 我刚刚创建了一个新项目并使用了与您相同的代码,即使我对 ImageView 和 EditText 使用相同的 onClick 名称,它也对我有用。 Android studio,最低 sdk 21 目标 22。我们需要更多信息来帮助您
【解决方案2】:

也许这有助于其他人节省寻找解决方案的时间。我为 appcompat7 提出了一个问题,该问题被以下评论接受:

此问题已在下一个平台版本中修复,但在 appcompat 中修复此问题可能不可行。

详情: https://code.google.com/p/android/issues/detail?id=174871

所以这确实是 appcompat 的一个错误/问题,我将退回到以编程方式添加 onClick 侦听器。

【讨论】:

  • 我确认,这是一个错误:) 刚刚发生在我身上,异常消息是'没有这样的功能'。糟糕的谷歌!
  • 我刚遇到appcompat-v7:22.2.0 的问题,转到链接并注意到一个小时前的帖子状态已更改为FutureRelease
【解决方案3】:

我在Issue 174871 上使用了#5 中的以下提示:

改变: &lt;EditText .../&gt;&lt;android.widget.EditText .../&gt;

所以 Appcompat 不再处理 onClick

【讨论】:

  • 我认为这根本不是一个解决方案。 AFAIK 这只是意味着,您不再使用 appcompat EditText 小部件,而是将其替换为“本机”Android 小部件。这意味着,它的行为和外观取决于您所针对的 Android 版本。 Appcompat 正在为旧版本“模拟”较新 Android 版本的行为,因此您将失去所有“新”EditText 功能(这对您和 EditText 来说可能没问题)。
猜你喜欢
  • 2021-03-11
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 2022-07-20
相关资源
最近更新 更多