【问题标题】:android:onClick doesn't work with Android 4.0.3android:onClick 不适用于 Android 4.0.3
【发布时间】:2015-03-13 13:10:53
【问题描述】:

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>

这是活动

public class HomeActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home);
    }

    /**
     * Crea l'action bar
     *
     * @param menu
     * @return
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main_actionbar, menu);
        return true;
    }

    /**
     * Apertura del dialog box con le informazioni sulla versione del programma
     *
     * @param v
     */
    public void aboutDialog(MenuItem v) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("Test")
                .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        // FIRE ZE MISSILES!
                    }
                })
                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        // User cancelled the dialog
                    }
                });
        // Create the AlertDialog object and return it
        builder.create().show();
    }
}

所以这段代码没有什么奇怪的。但是当我尝试在设备上运行时,我遇到了这个异常:

android.view.InflateException: Couldn't resolve menu item onClick handler 
    aboutDialog in class android.view.ContextThemeWrapper

        at android.view.MenuInflater$InflatedOnMenuItemClickListener.<init>   (MenuInflater.java:202)
        at android.view.MenuInflater$MenuState.setItem(MenuInflater.java:402)
        at android.view.MenuInflater$MenuState.addItem(MenuInflater.java:436)
        at android.view.MenuInflater.parseMenu(MenuInflater.java:173)
        at android.view.MenuInflater.parseMenu(MenuInflater.java:151)
        at android.view.MenuInflater.inflate(MenuInflater.java:95)
        at 
        it.mobile.activity.home.HomeActivity.onCreateOptionsMenu(HomeActivity.java:38)
        at android.app.Activity.onCreatePanelMenu(Activity.java:2444)
        at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:388)
        at com.android.internal.policy.impl.PhoneWindow.invalidatePanelMenu(PhoneWindow.java:739)
        at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:2833)
        at android.os.Handler.handleCallback(Handler.java:605)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4424)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
        at dalvik.system.NativeStart.main(Native Method)

 Caused by: java.lang.NoSuchMethodException: aboutDialog 
 [interface android.view.MenuItem]
        at java.lang.Class.getConstructorOrMethod(Class.java:460)
        at java.lang.Class.getMethod(Class.java:915)
        at android.view.MenuInflater$InflatedOnMenuItemClickListener.<init>  

但我不明白问题出在哪里。使用其他设备一切正常!

【问题讨论】:

  • 因为这个参数,在你的 aboutDialog 方法中你有一个参数 MenuItem 并且只有 onclick 它不会工作

标签: android menuitem


【解决方案1】:

不知道如何仅使用 xml 来解决它。 从代码的角度来看,您必须实现
public boolean onOptionsItemSelected(MenuItem item) 然后根据菜单项调用所需的处理程序。

【讨论】:

    【解决方案2】:

    虽然这已经过时,但这里是异常的原因。当你在 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;
    }
    

    这是发生异常的情况。正如我们所见,该方法试图在传递的上下文项的类上找到回调方法。因此,您应该调用new MenuInflator(this),而不是在onCreateOptionsMenu 中调用getMenuInflator(),这样this 作为上下文传递,然后代码就可以工作了。

    另一个错误修复是从清单中删除主题,我仍然很困惑为什么会这样。但是,这只是一种解决方法。

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,我在这里找到了这个 -https://code.google.com/p/android/issues/detail?id=62795

          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)
                  />
      

      我通过从 TextView 中删除 android:theme 解决了这个问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-09
        相关资源
        最近更新 更多