android:onClick不适用于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=

我对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="@+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)
            />