找不到方法 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
的基础主题,并分配为 View
的 Context
。因为这个 Context
不再是 而不是 你的 Activity
(Activity
必须分开,因为它仍然必须 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 按钮时帮助了我。检查一下:)
我有一个大约一年的应用程序,它在 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
的基础主题,并分配为 View
的 Context
。因为这个 Context
不再是 而不是 你的 Activity
(Activity
必须分开,因为它仍然必须 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 按钮时帮助了我。检查一下:)