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

Sco*_*ott 18 android onclick android-5.0-lollipop

我有一个大约一岁的应用程序,在测试版的Play商店,已经经历了几十次修订.突然间我收到了一个错误:

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

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

我已经仔细检查了拼写,大写,没有通常的嫌疑人解释这一点.这是相关代码的示例.如果您觉得更有帮助,请告诉我.(该活动有915行代码和xml 186,所以不要求整个事情).在运行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>
Run Code Online (Sandbox Code Playgroud)

Pick.java:

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

的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')
}
Run Code Online (Sandbox Code Playgroud)

日志完全错误:

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)
Run Code Online (Sandbox Code Playgroud)

Dan*_*ent 22

看起来这是Android 5.0的新问题.

这个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>
Run Code Online (Sandbox Code Playgroud)

并在AndroidManifest.xml中添加主题:

android:theme="@android:style/AppTheme"
Run Code Online (Sandbox Code Playgroud)


ci_*_*ci_ 19

我刚才在这里回答了类似的问题

基本上,由于Android 5.0 个人观点可以主题化.

为了便于此,一个ContextThemeWrapper用于修改分配给所述基本主题Activity和分配为ContextView.由于这Context不是你的Activity了(的Activity必须是独立的,因为它仍然必须返回原来的主题)的回调不存在,你会得到你看到的错误.

如果你真的不想主题个人观点,那么显而易见的解决方案就是不这样做,而是按照已经建议的方式对活动进行主题化.

如果你确实想主题个人观点,看来该android:onClick属性不能用,你将不得不回落到手动分配OnClickListener.

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