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和分配为Context的View.由于这Context是不是你的Activity了(的Activity必须是独立的,因为它仍然必须返回原来的主题)的回调不存在,你会得到你看到的错误.
如果你真的不想主题个人观点,那么显而易见的解决方案就是不这样做,而是按照已经建议的方式对活动进行主题化.
如果你也确实想主题个人观点,看来该android:onClick属性不能用,你将不得不回落到手动分配OnClickListener.
问题是,为什么这个工作在Lollipop之前?我只能推测,因为主题单个视图的功能不存在,将theme属性应用于视图只会更改默认主题Activity.
| 归档时间: |
|
| 查看次数: |
17684 次 |
| 最近记录: |