【问题标题】:onOptionsItemSelected not called when using actionLayout (SherlockActionBar)使用 actionLayout (SherlockActionBar) 时未调用 onOptionsItemSelected
【发布时间】:2012-07-24 09:26:02
【问题描述】:

在菜单项中使用 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);    
    }
}

菜单

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

【问题讨论】:

  • '@layout/action_bar_comment_layout' 是什么样子的?

标签: android


【解决方案1】:

好吧,您必须在该 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);
}

【讨论】:

  • 工作正常,谢谢。顺便说一句,您可以使用 findItem 而不是遍历所有菜单项
  • 可以将其缩短为:public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate(R.menu.map_menu, menu); menu.findItem(R.id.menu_more).getActionView().setOnClickListener(this);返回 super.onCreateOptionsMenu(menu); }
  • 你应该使用 MenuItemCompat.getActionView(item) 和 actionbarcompat。
  • 你也可以在 onPrepareOptionsMenu 中这样做
  • 这里 itemChooser 是一个视图。
【解决方案2】:

您必须添加自己的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));
        }
    });
}

P.S:不知道为什么它不能开箱即用。

【讨论】:

  • 最佳答案,到目前为止
【解决方案3】:

如果您正在为旧版本开发,您应该使用 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;
    }

【讨论】:

    【解决方案4】:
     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
    }
    

    为我工作(代码在 kotlin 中)

    【讨论】:

      【解决方案5】:
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          super.onCreateOptionsMenu(menu);
          getMenuInflater().inflate(R.menu.main, menu);
          View view = menu.findItem(R.id.menu_item_comment).getActionView();
          view.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  // do something
              }
          });
          return true;
      }
      

      另外,(这对我来说非常重要,所以其他答案不起作用)您需要禁用操作布局中所有视图的可点击选项(即 action_bar_comment_layout.xml):

      android:clickable="false"
      

      【讨论】:

        【解决方案6】:

        结合@Arun Kumar 和@Luten 的答案,下面的方法将使实现变得通用。对于所有使用actionView的菜单项,我们setOnClickListener调用onOptionsItemSelected(item)。 这样我们就可以混合和匹配 normal 和 actionLayout 菜单项,而不必担心设置单独的 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);
        }
        

        【讨论】:

        • 非常好 - 非常感谢!!可悲的是,我们需要这样一个片段,而框架本身并不包含它......
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多