我正在测试我的应用程序在一些不同的Android版本的设备上。 我使用KitKat在我的MotoG上进行了测试,它运行得很完美但是在使用冰淇淋三明治对三星进行测试时,它给出了一些奇怪的例外。
这是我的OnCreateOptionMenu()
方法:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
// TODO Auto-generated method stub
super.onCreateOptionsMenu(menu, inflater);
menu.clear();//Exception occurs here
inflater.inflate(R.menu.add_contact, menu);
item = menu.findItem(R.id.addContact);
//if 5 contacts are already Selected,hide add icon from ActionBar
if(!contactsList.isEmpty())
{
if(contactsList.size() >= 5)
{
item.setVisible(false);
getActivity().supportInvalidateOptionsMenu();
}
}
}
这些是我得到的一些LogCat例外:
10-14 11:47:14.326: E/AndroidRuntime(17176): FATAL EXCEPTION: main
10-14 11:47:14.326: E/AndroidRuntime(17176): java.lang.StackOverflowError
10-14 11:47:14.326: E/AndroidRuntime(17176): at java.util.HashMap.clear(HashMap.java:666)
10-14 11:47:14.326: E/AndroidRuntime(17176): at android.support.v7.internal.view.menu.BaseMenuWrapper.internalClear(BaseMenuWrapper.java:76)
10-14 11:47:14.326: E/AndroidRuntime(17176): at android.support.v7.internal.view.menu.MenuWrapperICS.clear(MenuWrapperICS.java:108)
10-14 11:47:14.326: E/AndroidRuntime(17176): at com.ContactsFragment.onCreateOptionsMenu(ContactsFragment.java:443)
10-14 11:47:14.326: E/AndroidRuntime(17176): at android.support.v4.app.Fragment.performCreateOptionsMenu(Fragment.java:1582)
10-14 11:47:14.326: E/AndroidRuntime(17176): at android.support.v4.app.FragmentManagerImpl.dispatchCreateOptionsMenu(FragmentManager.java:1967)
10-14 11:47:14.326: E/AndroidRuntime(17176): at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:225)
10-14 11:47:14.326: E/AndroidRuntime(17176): at android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.java:232)
答案 0 :(得分:1)
请勿在onCreateOptionsMenu中调用supportInvalidateOptionsMenu().....
系统调用onCreateOptionsMenu()后,它会保留一个实例 您填充的菜单,并且不会再次调用onCreateOptionsMenu() 除非由于某种原因菜单失效。但是,你应该 使用onCreateOptionsMenu()仅创建初始菜单状态和 不要在活动生命周期中进行更改。
如果要根据发生的事件修改选项菜单 在活动生命周期中,你可以这样做 onPrepareOptionsMenu()方法。此方法将传递Menu对象 因为它当前存在,所以你可以修改它,如添加,删除或 禁用项目。 (片段还提供onPrepareOptionsMenu() 回调。)
我想上面介绍了如何正确实现它。
答案 1 :(得分:1)
//只需使用此
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
// TODO Auto-generated method stub
super.onCreateOptionsMenu(menu, inflater);
menu.clear();//Exception occurs here
inflater.inflate(R.menu.add_contact, menu);
item = menu.findItem(R.id.addContact);
//if 5 contacts are already Selected,hide add icon from ActionBar
if(!contactsList.isEmpty())
{
if(contactsList.size() >= 5)
{
item.setVisible(false);
}
}
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
item = menu.findItem(R.id.addContact);
//if 5 contacts are already Selected,hide add icon from ActionBar
if(!contactsList.isEmpty())
{
if(contactsList.size() >= 5)
{
item.setVisible(false);
}
}
return super.onPrepareOptionsMenu(menu);
}
现在,只要您的列表达到5个以上的联系人容量,invalidateOptionMenu
这将确保调用准备,并且在这种情况下您的菜单仍然隐藏。