1

我想在选项菜单中创建一个菜单项的实例,然后对其进行操作。

这是菜单 xml 中项目的代码:

<item
    android:id="@+id/colour"
    android:orderInCategory="1"
    android:showAsAction="never"
    android:title="Colour"
    android:checkable="true"
    android:checked="true" />   

这是我的 Activity 类中的尝试代码:

MenuItem i = (MenuItem)findViewById(R.id.colour);
i.setChecked(false);

上面的代码没有语法错误,但应用程序在运行时会中断。我用谷歌搜索了一段时间,找不到答案。

编辑

我把它放在我的顶部activity class

private Menu menus; // create global Menu variable 'menus' that is the instance of the menu that holds the menu item I want to create and manipulate
private MenuItem item; // create global MenuItem variable 'item' that is the instance of the menu item I want to create and manipulate

我已经把它放在我的onCreateOptionsMenu(Menu menu)方法中:

getMenuInflater().inflate(R.menu.main, menu);
menus = menu; // assign global 'menus' Menu variable to be the parameter 'menu' Menu variable for this method
// or this.menus = menu; // both give the same result

我已经把这段代码放在了button listener我的activity class

item = menus.findItem(R.id.settings); // assign the instance of the MenuItem to be an item in the instance of the Menu variable created

if (item.isChecked())
{
    item.setChecked(false);
}
else if (!item.isChecked())
{
    item.setChecked(true);
}

即使我注释掉上面的 if 结构,我仍然会收到这个 logCat 错误:

09-02 07:05:34.900: E/AndroidRuntime(9036): FATAL EXCEPTION: main
09-02 07:05:34.900: E/AndroidRuntime(9036): java.lang.NullPointerException
09-02 07:05:34.900: E/AndroidRuntime(9036):     at com.mikeyaworski.secretnotepad.Main$6.onClick(Main.java:615)
09-02 07:05:34.900: E/AndroidRuntime(9036):     at android.view.View.performClick(View.java:4203)
09-02 07:05:34.900: E/AndroidRuntime(9036):     at android.view.View$PerformClick.run(View.java:17189)
09-02 07:05:34.900: E/AndroidRuntime(9036):     at android.os.Handler.handleCallback(Handler.java:615)
09-02 07:05:34.900: E/AndroidRuntime(9036):     at android.os.Handler.dispatchMessage(Handler.java:92)
09-02 07:05:34.900: E/AndroidRuntime(9036):     at android.os.Looper.loop(Looper.java:137)
09-02 07:05:34.900: E/AndroidRuntime(9036):     at android.app.ActivityThread.main(ActivityThread.java:4961)
09-02 07:05:34.900: E/AndroidRuntime(9036):     at java.lang.reflect.Method.invokeNative(Native Method)
09-02 07:05:34.900: E/AndroidRuntime(9036):     at java.lang.reflect.Method.invoke(Method.java:511)
09-02 07:05:34.900: E/AndroidRuntime(9036):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
09-02 07:05:34.900: E/AndroidRuntime(9036):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
09-02 07:05:34.900: E/AndroidRuntime(9036):     at dalvik.system.NativeStart.main(Native Method)

当我注释掉该行时:item = menus.findItem(R.id.settings);,我没有收到任何错误。所以问题出在那行代码中。我添加的每一行代码都没有语法错误。

谁能告诉我这种在我instanceMenuItem任何一个中创建和操作的方法有什么问题?methodactivity class

4

2 回答 2

5

您必须在 Activity 类中这样做:

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    super.onCreateOptionsMenu(menu);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu); // inflate your menu resource

    if (menu != null) {
        MenuItem color = menu.findItem(R.id.color);
        if (color != null) {
            color.setChecked(false);
        }
    }
    return true;
}
于 2013-08-30T09:29:02.860 回答
0

回答你的第二个问题

以下是在这些方法中以及在没有 Menu 实例作为传递参数的情况下如何非常轻松地操作菜单实例的方法:

创建一个全局菜单变量:

private Menu menu;

现在在onCreateOptionMenu()中,将当前菜单实例分配给您全局声明的菜单实例,如下所示:

@Override
public boolean onCreateOptionsMenu(Menu menu) 
{
    getMenuInflater().inflate(R.menu.menu, menu);

    this.menu = menu;

    return true;
}

现在您可以在任何您想要的活动中使用它。

例如(我要更新一些菜单图标)

private MenuItem item1, item2;
Boolean original = true;

private void update() {

    item1 = menu.findItem(R.id.todaySched);
    item2 = menu.findItem(R.id.infoLog);

    if (original) {
        item1.setIcon(getResources().getDrawable(
                      android.R.drawable.ic_menu_search));
        item2.setIcon(getResources().getDrawable(
                      android.R.drawable.ic_menu_report_image));
        original = false;
    } else if (!original) {

        item1.setIcon(getResources().getDrawable(
                      android.R.drawable.ic_menu_my_calendar));
        item2.setIcon(getResources().getDrawable(
                      android.R.drawable.ic_menu_info_details));
        original = true;
    }
}
于 2013-08-30T09:47:46.760 回答