【问题标题】:Could not find a method onClick_Foo(View) - first time running on Android Lollipop找不到方法 onClick_Foo(View) - 第一次在 Android Lollipop 上运行
【发布时间】:2016-04-17 13:43:33
【问题描述】:

我有一个大约一年前的应用,在 Play 商店中处于测试阶段,经过了数十次修改。突然间我收到一个错误:

在活动类中找不到方法 onClick_Foo(View) android.view.ContextThemeWrapper 用于视图类上的 onClick 处理程序 id 为 'Foo_Button' 的 android.widget.Button

我的 XML 中定义的 7 个按钮中的每一个都出现此错误。从昨天开始,我已经将 appcompat-v7 从 21.0.3 更新到 22.0.0,还首次将我的测试设备从 KitKat 升级到了 Lollipop。

我仔细检查了拼写、大小写,没有一个常见的嫌疑人能解释这一点。这是相关代码的示例。让我知道您是否觉得有更多帮助。 (该活动有 915 行代码和 186 行 xml,所以不要要求全部内容)。在运行 Lollipop 5.0.1 的 Verizon Note 4 上进行测试

activity_pick.xml:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:theme="@style/AppTheme"
    tools:context="com.myapp.Pick"
    android:layout_height="match_parent"
    android:layout_width="match_parent">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:orientation="vertical">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/Ratings_Button"
            android:textSize="16dp"
            android:text="@string/Pick_Ratings_Button"
            android:onClick="onClick_Ratings"
            android:background="@android:drawable/btn_default"/>
</LinearLayout>
</ScrollView>

Pick.java:

public class Pick_Restaurant extends ActionBarActivity {
    public void onClick_Ratings (View v) {
        Intent intent = new Intent(mContext, Ratings.class);
        startActivityForResult(intent,RATINGS);
    }
}

build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

defaultConfig {
    minSdkVersion 15
    targetSdkVersion 22
    versionCode 59
    versionName "0.6.4"
}

...

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:22.0.0'
    compile 'com.google.android.gms:play-services:7.0.0'
    compile files('libs/mobileservices-1.1.5.jar')
}

日志完全错误:

04-08 17:06:40.578    3508-3508/com.myapp.debug E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.myapp.debug, PID: 3508
    java.lang.IllegalStateException: Could not find a method onClick_Ratings(View) in the activity class android.view.ContextThemeWrapper for onClick handler on view class android.widget.Button with id 'Ratings_Button'
            at android.view.View$1.onClick(View.java:4234)
            at android.view.View.performClick(View.java:5191)
            at android.view.View$PerformClick.run(View.java:20916)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5974)
            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:1388)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
     Caused by: java.lang.NoSuchMethodException: onClick_Ratings [class android.view.View]
            at java.lang.Class.getMethod(Class.java:665)
            at android.view.View$1.onClick(View.java:4227)
            at android.view.View.performClick(View.java:5191)
            at android.view.View$PerformClick.run(View.java:20916)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5974)
            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:1388)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)

【问题讨论】:

  • 这很奇怪。只是一个想法,您可以尝试从 xml 中删除 onClick 并在您的 Activity 中调用 setOnClickListener()
  • 我在我的 XML 中设置了整个应用程序的 onClicks。我真的不热衷于重新编码。这已经好几个月了,仍然是处理按钮的推荐方式。

标签: android onclick android-5.0-lollipop


【解决方案1】:

这似乎是 Android 5.0 的一个新问题。

this anwer,从布局 xml 中删除 Theme 为他们解决了这个问题。

因此,在您的情况下,请从布局中删除 theme

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <!--android:theme="@style/AppTheme"--> <!-- Remove this -->
    <!--................-->
  </ScrollView>

并改为在 AndroidManifest.xml 中添加主题:

android:theme="@android:style/AppTheme"

【讨论】:

  • 哦,伙计 - 我非常专注于 appcompat 更改,我没有意识到这可能是我第一次在 Lollipop 设备上测试它。所以这是一个棒棒糖问题,而不是 appcompat 问题。主题修复有效!
  • 以编程方式设置主题时会发生同样的错误。前任。为 DialogFragment 设置自定义主题。
  • 谷歌可耻!就我而言,这发生在标准首选项中,因此我无法删除他们的主题。 ;-/
  • 谢谢,奇怪的错误,还必须从所有根布局和父布局中删除样式,最好的办法是使用 clicklistener !我猜!
【解决方案2】:

我刚刚回答了一个类似的问题here

基本上,从 Android 5.0 开始individual views can be themed

为了方便这一点,ContextThemeWrapper 用于修改分配给Activity 并分配为ViewContext 的底层主题。由于这个Context 不再是你的ActivityActivity 必须分开,因为它仍然必须返回原始主题)回调不存在并且你得到错误你见。

如果您真的不想为单个视图设置主题,显而易见的解决方案是不这样做,而是为活动设置主题,正如已经建议的那样。

如果您确实确实想要为单个视图设置主题,则似乎无法使用android:onClick 属性,您将不得不手动分配OnClickListener

问题是,为什么这在 Lollipop 之前有效?我只能推测,因为不存在为单个视图设置主题的功能,将theme 属性应用于视图只会更改Activity 上的默认主题。

【讨论】:

  • 你是对的,为什么它在 Lollipop 之前起作用。它也不适用于支持库。
【解决方案3】:

当你像你一样在 xml 中声明 onClick 时,通常会发生这种情况:

android:onClick="onClick_Ratings"

只需确保您在该活动中使用此布局即可。因为异常清楚地表明您的活动没有您所展示的相应方法:

public void onClick_Ratings (View v) {
    Intent intent = new Intent(mContext, Ratings.class);
    startActivityForResult(intent,RATINGS);
}

另外我猜你应该在你的 xml 中声明这个活动,比如:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".SendMessageActivity">

实际上日志说:

在活动类中找不到方法 onClick_Ratings(View) android.view.ContextThemeWrapper

因为android.view.ContextThemeWrapper 不是Activity 而不是来自您的xml 的活动com.myapp.Pick (我假设Pick 是一个活动而不是片段),所以有问题。也许尝试清理项目,验证缓存并重新启动。
如果没有任何帮助,我建议您返回之前提到的支持库版本,或者在代码而不是 xml 中设置 onClickListener。

【讨论】:

    【解决方案4】:

    删除 android:theme 有效。但这是因为在 xml 中使用了android:onclick。如果你在 Java 文件中使用 onClick,你仍然可以使用 android:theme

    根据你的代码,

    activity_pick.xml [点击此处删除]

     <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/Ratings_Button"
            android:textSize="16dp"
            android:text="@string/Pick_Ratings_Button"        
            android:background="@android:drawable/btn_default" />
    

    转到您的 Java 文件,即 pick.java 在您的情况下:

        final Button button = (Button) findViewById(R.id.Ratings_Button);
    
        button.setOnClickListener(new View.OnClickListener() {
    
            public void onClick(View v) {
                Intent activityChangeIntent = new Intent(CurrentActivity.this, SecondActivity.class);
                SplashScreen.this.startActivity(activityChangeIntent);
            }
        });
    

    遇到同样的错误,应用程序已停止工作,当以编程方式单击材料按钮时帮助我。看看吧:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 2016-07-11
      • 2014-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多