onOptionsItemSelected not called when using actionLayout (SherlockActionBar)

Viewed 29822

The method onOptionsItemSelected isn't being called when using actionLayout in a menu item. Am I missing something, or is it a known problem with SherlockActionBar?

Activity

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.article, menu);

    super.onCreateOptionsMenu(menu);

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {   

    Log.d(TAG, "onOptionsItemSelected()");

    switch (item.getItemId()) {        
        case android.R.id.home:            
            finish();      
            return true; 
        case R.id.menu_item_comment:
            return true;
        default:            
            return super.onOptionsItemSelected(item);    
    }
}

Menu

<item android:id="@+id/menu_item_comment"
    android:showAsAction="ifRoom"
    android:actionLayout="@layout/action_bar_comment_layout"/>

6 Answers
 override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.menu_add_require, menu)

    val menuItem = menu!!.findItem(R.id.menu_cart)
    val view = menuItem.actionView
    view.setOnClickListener {
        onOptionsItemSelected(menuItem)
    }

    return true
}

Working for me (code is in kotlin)

Combining @Arun Kumar's and @Luten's answers, the below method will make the implementation generic. For all the menu items using actionView, we setOnClickListener to call onOptionsItemSelected(item). This way we can mix and match normal and actionLayout menu items, without worrying about setting individual onClickListeners.

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.clear();
    inflater.inflate(menuResourceId(), menu);

    for (int i = 0; i < menu.size(); i++) {
        final MenuItem item = menu.getItem(i);
        View actionView = MenuItemCompat.getActionView(item);
        if (actionView != null) {
            actionView.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v){
                    onOptionsItemSelected(item);
                }
            });
        }
    }

    super.onCreateOptionsMenu(menu, inflater);
}
Related