从菜单中获取奇怪的异常

时间:2014-10-14 06:28:51

标签: android exception android-menu stack-overflow

我正在测试我的应用程序在一些不同的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)

2 个答案:

答案 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这将确保调用准备,并且在这种情况下您的菜单仍然隐藏。