android:onClick不适用于android 4.0.3
我对Android API 15中的简单视图有一个奇怪的问题。在这个视图中,我有一个包含2个菜单项的简单菜单。 此代码适用于其他Android API,但不适用于使用Android 4.0.3的手机:android:onClick不适用于android 4.0.3,android,menuitem,Android,Menuitem,我对Android API 15中的简单视图有一个奇怪的问题。在这个视图中,我有一个包含2个菜单项的简单菜单。 此代码适用于其他Android API,但不适用于使用Android 4.0.3的手机: <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id=
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/root_menu"
android:icon="@android:drawable/ic_menu_help"
android:showAsAction="always"
android:title="Help">
<menu>
<item
android:id="@+id/menu_about"
android:onClick="aboutDialog"
android:showAsAction="never"
android:title="About"/>
</menu>
</item>
</menu>
所以这段代码没有什么奇怪的地方。但当我尝试在设备上运行时,我遇到了以下异常:
android.view.InflateException:无法解析单击处理程序时的菜单项
aboutDialog在类android.view.ContextThemeWrapper中
在android.view.MenuInflater$InflatedOnMenuItemClickListener。java:202
在android.view.MenuInflater$MenuState.setItemMenuInflater.java:402
在android.view.MenuInflater$MenuState.addItemMenuInflater.java:436
在android.view.MenuInflater.parseMenuInflater.java:173
在android.view.MenuInflater.parseMenuInflater.java:151
在android.view.MenuInflater.inflateMenuInflater.java:95
在
it.mobile.activity.home.HomeActivity.onCreateOptionsMenuHomeActivity.java:38
在android.app.Activity.onCreatePanelMenuActivity.java:2444
在com.android.internal.policy.impl.PhoneWindow.preparePanelPhoneWindow.java:388
在com.android.internal.policy.impl.PhoneWindow.InvalidatePanelMemumePhoneWindow.java:739
com.android.internal.policy.impl.PhoneWindow$1.runPhoneWindow.java:2833
位于android.os.Handler.handleCallbackHandler.java:605
位于android.os.Handler.dispatchMessageHandler.java:92
在android.os.Looper.Looper.java:137
在android.app.ActivityThread.mainActivityThread.java:4424
在java.lang.reflect.Method.invokenactive方法中
位于java.lang.reflect.Method.invokeMethod.java:511
位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.runZygoteInit.java:784
位于com.android.internal.os.ZygoteInit.mainZygoteInit.java:551
在dalvik.system.NativeStart.mainNative方法
原因:java.lang.NoSuchMethodException:aboutDialog
[界面android.view.MenuItem]
java:460
位于java.lang.Class.getMethodClass.java:915
在android.view.MenuInflater$InflatedOnMenuItemClickListener。
但我不明白问题出在哪里。使用另一个设备,一切正常 不知道如何仅用xml解决它。 从代码的角度来看,您必须实现 公共布尔值OnOptions ItemSelectedMenuItem项
然后根据菜单项调用所需的处理程序。不知道如何仅用xml解决它。 从代码的角度来看,您必须实现 公共布尔值OnOptions ItemSelectedMenuItem项
然后根据菜单项调用所需的处理程序。尽管这已过时,但以下是出现异常的原因。在MenuInflator类中查看android API 15 4.0.3-4.0.4的源代码时,您将看到以下方法:
public InflatedOnMenuItemClickListener(Context context, String methodName) {
mContext = context;
Class<?> c = context.getClass();
try {
mMethod = c.getMethod(methodName, PARAM_TYPES);
} catch (Exception e) {
InflateException ex = new InflateException(
"Couldn't resolve menu item onClick handler " + methodName +
" in class " + c.getName());
ex.initCause(e);
throw ex;
}
这是一个例外。正如我们看到的,该方法试图在传递的上下文项的类上找到回调方法。因此,您不应该在OnCreateOptions菜单中调用getMenuInflator,而应该调用new MenuInflator,以便将其作为上下文传递,然后代码就可以工作了
另一个bug修复是从清单中删除主题,我仍然很困惑为什么这样做有效。不过,这只是一个解决办法。尽管这已经过时,但以下是例外情况的原因。在MenuInflator类中查看android API 15 4.0.3-4.0.4的源代码时,您将看到以下方法:
public InflatedOnMenuItemClickListener(Context context, String methodName) {
mContext = context;
Class<?> c = context.getClass();
try {
mMethod = c.getMethod(methodName, PARAM_TYPES);
} catch (Exception e) {
InflateException ex = new InflateException(
"Couldn't resolve menu item onClick handler " + methodName +
" in class " + c.getName());
ex.initCause(e);
throw ex;
}
这是一个例外。正如我们看到的,该方法试图在传递的上下文项的类上找到回调方法。因此,您不应该在OnCreateOptions菜单中调用getMenuInflator,而应该调用new MenuInflator,以便将其作为上下文传递,然后代码就可以工作了
另一个bug修复是从清单中删除主题,我仍然很困惑为什么这样做有效。但是,这只是一个解决办法。我遇到了类似的问题,我在这里发现了这个-
我通过从TextView中删除android:theme解决了这个问题,我遇到了类似的问题,我在这里发现了这个-
我通过删除文本视图中的android:theme解决了这个问题,因为这个参数,在aboutDialog方法中,你有一个参数MenuItem,只有onclick才起作用,因为这个参数,在aboutDialog方法中,你有一个参数MenuItem,只有onclick才起作用
This is affecting Android 5.0 when applying the android:theme attribute.
<Button
android:theme="@android:style/Theme.Material"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onLoginEmail"
Clicking on the button throws
java.lang.IllegalStateException: Could not find a method onLoginEmail(View) in the activity class android.view.ContextThemeWrapper for onClick handler on view class android.widget.Button
at android.view.View$1.onClick(View.java:3994)
at android.view.View.performClick(View.java:4756)
at android.view.View$PerformClick.run(View.java:19749)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
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:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.NoSuchMethodException: onLoginEmail [class android.view.View]
at java.lang.Class.getMethod(Class.java:664)
at java.lang.Class.getMethod(Class.java:643)
at android.view.View$1.onClick(View.java:3987)
at android.view.View.performClick(View.java:4756)
at android.view.View$PerformClick.run(View.java:19749)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
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:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
/>