android:onClick 不适用于 Android 4.0.3

标签 android menuitem

Android API 15 中的简单 View 存在一个奇怪的问题。在此 View 中,我有一个包含 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>

这是 Activity

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>  

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

最佳答案

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

关于android:onClick 不适用于 Android 4.0.3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21457929/

相关文章:

java - 重写的函数未接收数据?

javascript - 如何在选择菜单项时调用 Javascript 函数?

Android 菜单项文本和自动大写禁用

android - TextView和其他TextView挤压时的Ellipsize

java - 冷启动 : Snapshot doesn't exist

android - 异步任务和 Sqlite

android:layout_marginLeft 指的是父 View 还是周围 View ?

WPF MenuItem.Click 在育儿后中断

Delphi IDE自定义菜单项,如何添加它们?

android - NavigationView:使用 app:actionLayout 自定义项目布局如何?