我想在选项菜单中创建菜单项的实例,然后对其进行操作。
以下是菜单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);
上面的代码没有语法错误,但app在运行时会中断。我用谷歌搜索了一会儿,找不到答案。
修改
我把它放在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);
时,我没有收到任何错误。所以问题在于那行代码。我添加的每一行代码都没有语法错误。
任何人都可以告诉我在instance
MenuItem
的任何method
中创建和操纵activity class
{{1}}的方法有什么问题吗?
答案 0 :(得分:3)
你必须在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;
}
答案 1 :(得分: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;
}
}