onprepareoptionsmenu默认调用

时间:2015-02-01 11:24:03

标签: android android-actionbar android-menu

我需要在菜单项的点击事件期间动态更改菜单项。

所以我在一项活动中实施了 onOptionsItemSelected

public class ResultActivity extends Activity {

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main_actions, menu);
        return true;
    }
}

我正在 onOptionsItemSelected 方法中调用 invalidateOptionsMenu ,该方法应调用 onPrepareOptionsMenu

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id){
            case R.id.action_group: {
                invalidateOptionsMenu();
                break;
            }
               }
}

另外,我正在尝试从onPrepareOptionsMenu方法的菜单中删除一个项目。

@Override
    public boolean onPrepareOptionsMenu(Menu menu) {


        Log.d(TAG,"In onPrepareOptionsMenu");
        menu.removeItem(R.id.action_group);
        Log.d(TAG,"Group icon is removed");

        return super.onPrepareOptionsMenu(menu);
    }

问题是,在活动启动期间删除了项目,而不是等到单击相应的菜单项。

有人能说出问题是什么.. TIA

1 个答案:

答案 0 :(得分:1)

问题在于,无论何时需要显示或重新加载菜单,都会调用onPrepareOptionsMenu(Menu)。这包括来自invalidateOptionsMenu()的来电,也来自正在创建的活动。

例如,您可以在实际删除项目之前检查布尔状态。

public boolean mRemoveItem;

@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id){
        case R.id.action_group: {
            mRemoveItem = true;
            invalidateOptionsMenu();
            break;
            }
           }
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    if (mRemoveItem) {
    menu.removeItem(R.id.action_group);
    }
    return super.onPrepareOptionsMenu(menu);
}

根据您的需要,您需要在代码中的某个位置将mRemoveItem设置回false