找不到方法 onClick_Foo(查看)- 第一次 运行 在 Android Lollipop 上

Could not find a method onClick_Foo(View) - first time running on Android Lollipop

我有一个大约一年的应用程序,它在 Play 商店中处于测试阶段,已经经历了数十次修订。突然我收到一个错误:

Could not find a method onClick_Foo(View) in the activity class android.view.ContextThemeWrapper for onClick handler on view class android.widget.Button with id 'Foo_Button'

我在 XML 中定义的 7 个按钮中的每一个按钮上都收到此错误。从昨天开始,我将 appcompat-v7 从 21.0.3 更新到 22.0.0,但也第一次将我的测试设备从 KitKat 升级到 Lollipop。

我仔细检查了拼写、大写,none 通常怀疑的人解释了这一点。这是相关代码的示例。让我知道您是否觉得更多会有所帮助。 (activity 有 915 行代码,xml 有 186 行代码,所以不要要求全部)。在 Verizon Note 4 运行 Lollipop 5.0.1

上进行测试

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.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.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)

这似乎是 Android 5.0 的新问题。

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

因此,在您的情况下,请从您的布局中删除 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"

当您在 xml 中声明 onClick 时,通常会发生这种情况,就像您所做的那样:

android:onClick="onClick_Ratings"

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

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

另外我猜你应该在你的 xml 中声明 activity 像:

<?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">

实际上日志说:

Could not find a method onClick_Ratings(View) in the activity class android.view.ContextThemeWrapper

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

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

基本上,因为 Android 5.0 individual views can be themed

为方便起见,ContextThemeWrapper 用于修改分配给 Activity 的基础主题,并分配为 ViewContext。因为这个 Context 不再是 而不是 你的 ActivityActivity 必须分开,因为它仍然必须 return 原来的主题) 回调不存在,你会得到你看到的错误。

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

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

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

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

根据您的代码,

activity_pick.xml [这里去掉onclick]

 <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);
        }
    });

遇到同样的错误,应用程序已停止工作,当以编程方式单击 material 按钮时帮助了我。检查一下:)