Enable/Disable ActionBar Menu Item

大兔子大兔子 提交于 2019-11-30 08:02:11
@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.addprojectmenu, menu);      

    menu.getItem(0).setEnabled(false); // here pass the index of save menu item
    return super.onPrepareOptionsMenu(menu);

}

Just inflate it on prepare time and disable after inflated menu no need to inflate in oncreateoptionemenu time or you can just use last two line of code after inflating from onCreateOptionMenu.

@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    menu.getItem(0).setEnabled(false); // here pass the index of save menu item
    return super.onPrepareOptionsMenu(menu);

}
mjwheat

I found this post because I wanted to achieve the same result. None of the other answers were completely helpful in getting this to work for me. After some research and trial and error I got mine to work. So I decided to share my results.

Variables I created for this task:

MenuItem save_btn;
boolean b = false;`

Then set up the Actionbar Menu:

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

@Override
public boolean onPrepareOptionsMenu(Menu menu){
    save_btn.setEnabled(b);
    super.onPrepareOptionsMenu(menu);       
    return true;
}

Since the variable boolean b is initialized as false the save_btn is disabled when the activity is created.

Here is the method to toggle the save_btn using @OpenSourceRulzz example:

private void updateSaveButton (CharSequence s){
    String text = null;
    if(s != null){
        text = s.toString();
    }
    if(text != null && text.trim().length() != 0){
        b = true;
    }
    else{
        b = false;
    }
}

This method is called through the TextWatcher() function for the EditText box in onCreate() again using @OpenSourceRulzz example

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.add_project);

    EditText projectName = (EditText) findViewById(R.id.editTextProjectName);   
    projectName.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            updateSaveButton(s);
            invalidateOptionsMenu();
        }           
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,int after){}
        @Override
        public void afterTextChanged(Editable s) {}
    });
}

The last piece of the puzzle was adding the invalidateOptionsMenu() method.

The part that I came up with that made mine work was using the boolean b variable to toggle the state of of the save_btn.

After struggling for 1 hour after this stupid issue, the only solution that worked for me is:

store the Menu in a local variable:

Menu menu;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    this.menu = menu;
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

Then change enabled status simply by calling:

menu.findItem(R.id.action_save).setEnabled(true);

And you can initially disable it just in the xml...

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if (your condition) {
        menu.findItem(R.id.saveButton).setEnabled(false);
    } else {
        menu.findItem(R;id.saveButton).setEnabled(true);
    }     
    return super.onPrepareOptionsMenu(menu);
}

With this method, your menu item will be disabled each time your condition is checked, and will be enabled if not.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!