Search code examples
androidandroid-optionsmenu

BaseActivity with common toolbar and menuItems activities can not catch onMenuItemClick


I've the base activity where all toolbar initializations and options menu are done, the activities extending the base can not fire onitemclick

In the base i have

public class BaseActivity extends AppCompatActivity {

private MenuItem refresh;

public Toolbar getToolbar() {
  return toolbar;
}

public MenuItem getRefresh() {
  return refresh;
} 

@Override
public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.menu_main, menu);
  refresh = menu.findItem(R.id.action_refresh);
  refresh.setActionView(R.layout.menu_item_view);
  return true;
}

@Override
  public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) {
    case android.R.id.home:
      onBackPressed();
      break;
  }
  return false;
}

 @Override
  public boolean onPrepareOptionsMenu(Menu menu) {

switch (mState) {
  case Const.STATE_IDLE:
    refresh.setVisible(true);
    break;
  case STATE_WORKING:
    refresh.setVisible(false);
    break;
  default:  
    refresh.setVisible(true);
    break;
}

return super.onPrepareOptionsMenu(menu);
}
}

In one of the activites I handle it like

       public class CommentsActivity extends BaseToolbarActivity
        {
         @Override
         public boolean onCreateOptionsMenu(Menu menu) {
         super.onCreateOptionsMenu(menu);
         return true;
         }
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
          super.onOptionsItemSelected(item);
          if(item.getItemId() == R.id.action_refresh){
            setState(Const.STATE_WORKING);
            showMsg(contentRoot,"oops");
           return true;
          }
          return super.onOptionsItemSelected(item);
        }
      }

but the click items won't fire


Solution

  • After a while I came to realize that since I was setting a custom layout for my items (useful for animations) an option menu with a custom view that is either set in the xml or dynamically using

     item.setActionView(R.layout.menu_lay);
    

    Just like my problem above the menu item can never be invoked by the normal onOptionsItemSelected listener so the way to make it work is to implement onClickListener on the item's custom View so in my case the way to make it invoke is by

            @Override
              public boolean onCreateOptionsMenu(Menu menu) {
                getRefresh.getActionView().setOnClickListener(new OnClickListener(){
                   @Override
                   public void onClick(View v) {   
                    //refresh some data
                   }
               });
            return true;
           }