使用actionLayout(SherlockActionBar)时未调用onOptionsItemSelected

use*_*545 43 android

在菜单项中使用actionLayout时,不会调用onOptionsItemSelected方法.我错过了什么,或者它是SherlockActionBar的已知问题?

活动

@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);    
    }
}
Run Code Online (Sandbox Code Playgroud)

菜单

<item android:id="@+id/menu_item_comment"
    android:showAsAction="ifRoom"
    android:actionLayout="@layout/action_bar_comment_layout"/>
Run Code Online (Sandbox Code Playgroud)

Tom*_*lec 46

好吧,你必须在该actionLayout上设置onClickListener来接收回调.我是这样做的:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getSupportMenuInflater().inflate(R.menu.map_menu, menu);
    for (int i = 0; i < menu.size(); i++) {
        MenuItem item = menu.getItem(i);
        if (item.getItemId() == R.id.menu_more) {
            itemChooser = item.getActionView();
            if (itemChooser != null) {
                itemChooser.setOnClickListener(this);
            }
        }
    }
    return super.onCreateOptionsMenu(menu);
}
Run Code Online (Sandbox Code Playgroud)

  • 工作得很好,谢谢.顺便说一句,您可以使用findItem而不是遍历所有菜单项 (16认同)
  • 可以缩短为:public boolean onCreateOptionsMenu(菜单菜单){getSupportMenuInflater().inflate(R.menu.map_menu,menu); menu.findItem(R.id.menu_more).getActionView()setOnClickListener(本).return super.onCreateOptionsMenu(menu); } (5认同)

Aru*_*mar 9

你应该使用MenuItemCompat.getActionView(menuItem); 而不是item.getActionView(); 如果你正在开发旧版本.

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        for (int i = 0; i< menu.size() ;i++) {
            MenuItem menuItem = menu.getItem(i);
            if (menuItem.getItemId() == R.id.add_item) {
                View view = MenuItemCompat.getActionView(menuItem);
                if (view != null) {
                    view.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {
                            Intent intent = new Intent(MainActivity.this, ToDoActivity.class);
                            startActivity(intent);
                        }
                    });
                }
            }
        }       
        return true;
    }
Run Code Online (Sandbox Code Playgroud)


Lut*_*ten 9

您必须添加自己的OnClickListener并明确调用onOptionsItemSelected:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuItem awesomeMenuItem = menu.findItem(R.id.action_awesome);
    View awesomeActionView = menuItem.getActionView();
    awesomeActionView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onOptionsItemSelected(awesomeMenuItem));
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

PS:不知道为什么它不能开箱即用.