【问题标题】:Detect click on Actionbar's Overflow menu button检测点击操作栏的溢出菜单按钮
【发布时间】:2018-08-04 19:43:31
【问题描述】:

我可以检测到操作栏的菜单按钮上的点击/点击,即用于显示溢出菜单项吗?

默认情况下,它会打开带有一项“设置”的列表。这是截图:

到目前为止,它正在检测点击“2”,但我想检测点击“1”。

【问题讨论】:

    标签: android android-actionbar overflow-menu


    【解决方案1】:

    检测点击溢出菜单有这样的代码:

    @Override
    public boolean onMenuOpened(int featureId, Menu menu) {
        if(featureId == AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR && menu != null){
            //overflow menu clicked, put code here...
        }
        return super.onMenuOpened(featureId, menu);
    }
    
    @Override
    public void onPanelClosed(int featureId, Menu menu) {
        ...
    }
    

    要检测菜单项的点击,以防您有这样的菜单:

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:id="@+id/menu2" android:alphabeticShortcut="b"
            android:title="Menu No. 2" android:orderInCategory="2">
            <menu >
            <group android:id="@+id/group2" android:checkableBehavior="single">
                <item android:id="@+id/submenu1" android:title="SubMenu No. 1" />
                <item android:id="@+id/submenu2" android:title="SubMenu No. 2" />
            </group>  
            </menu>
        </item>
    </menu>
    

    你应该能够检测到点击

    onOptionsItemSelected

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    
        Log.w("ANDROID MENU TUTORIAL:", "onOptionsItemSelected(MenuItem item)");
    
        // Handle item selection
        switch (item.getItemId()) {
        case R.id.menu2:
            Toast.makeText(this, "Clicked: Menu No. 2", Toast.LENGTH_SHORT).show();
            return true;   
            ...
    }
    

    【讨论】:

    • 答案已编辑。你想检测溢出菜单的点击,Android:developer.android.com/reference/android/view/…
    • 如果你使用AppCompatActivity,那么常量就是AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR。我真的被这个弄疯了。
    【解决方案2】:

    我终于找到了解决方案。覆盖 FragmentActivity.onKeyDown

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
        switch (keyCode) {
    
        case KeyEvent.KEYCODE_MENU:
            // Do Sometihng
            break;
    
        default:
            break;
        }
        return super.onKeyDown(keyCode, event);
    } 
    

    【讨论】:

      【解决方案3】:

      默认点击溢出按钮会显示选项菜单,所以我相信你应该设法拦截事件,然后通过覆盖Activity.onPrepareOptionsMenu来做你想做的事

      这有点棘手,因为我找不到溢出按钮的 id,所以我使用了这个 hack。 在你的Activity

      private boolean actionBarClicked = false;
      
      @Override
      public boolean onOptionsItemSelected (MenuItem item) {
          if (item.getId() == )
              actionBarClicked = true;
          return false; // Let default processing occur
      }
      
      @Override
      public boolean onPrepareOptionsMenu (Menu menu) {
          if (actionBarClicked) {
              // Overflow button of ActionBar was clicked, do what you want here.
              actionBarClicked = false;
          }
          ...
      }
      

      【讨论】:

        【解决方案4】:

        如果您正确设置了工具栏和膨胀菜单,只需在MainActivity中使用这两个功能

        @Override
        public boolean onMenuOpened(int featureId, Menu menu) {
            //Perform some action on menu open
            return super.onMenuOpened(featureId, menu);
        }
        
        @Override
        public void onPanelClosed(int featureId, Menu menu) {
            //Perform some action on menu closed
        }
        

        MainActivityonCreate功能中的设置工具栏

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        

        然后扩充您在 xml 文件中定义的菜单

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

        my_menu.xml

        <?xml version="1.0" encoding="utf-8"?>
        <menu xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:android="http://schemas.android.com/apk/res/android">
            <item
                android:id="@+id/action_something"
                android:title="@string/something_text" />
            <!--Other menu items-->
        </menu>
        

        【讨论】: