【问题标题】:How to open the options menu programmatically?如何以编程方式打开选项菜单?
【发布时间】:2011-03-09 04:18:50
【问题描述】:

我想以编程方式打开 optionsMenu,而无需用户单击菜单键。我该怎么做?

【问题讨论】:

    标签: android button menu android-activity


    【解决方案1】:

    两种方法:

    Activity.getWindow().openPanel(Window.FEATURE_OPTIONS_PANEL, event);
    

    event 参数是一个 KeyEvent 描述用于打开菜单的键,它可以根据来自的键盘类型修改菜单的显示方式。

    或者...通过模拟用户按下按钮:

    IWindowManager wManager = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
    KeyEvent kd = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_SOFT_LEFT);
    KeyEvent ku = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_SOFT_LEFT);
    wManager.injectKeyEvent(kd.isDown(), kd.getKeyCode(), kd.getRepeatCount(), kd.getDownTime(), kd.getEventTime(), true);
    

    【讨论】:

    • 我认为你的答案是最好的,因为 openOptionsMenu() withh 会导致应用程序在 HTC one 和 Sony Xperia Acro 上崩溃,而你的解决方案避免了这一点......所以谢谢你
    • IWindowManager 不是 SDK 的公共部分。你得到它的参考了吗?
    【解决方案2】:

    还是直接拨打Activity.openOptionsMenu()

    【讨论】:

    • 这个语句可以在Activity的oncreate()方法中执行吗?
    • @Vikas。将其放入 onAttachedToWindow() 中,如下面的 Kovac 所述。
    • 不工作,我在操作栏中有自定义视图,在子视图 onClick 上我调用打开/关闭选项菜单,super.open/close 也不起作用,任何想法,我弄错了,跨度>
    • 如何在 Fragment 中实现这个??
    【解决方案3】:

    把这行代码放在你的 onResume() 中,这应该会有帮助!

    new Handler().postDelayed(new Runnable() { 
       public void run() { 
         openOptionsMenu(); 
       } 
    }, 1000); 
    

    【讨论】:

      【解决方案4】:

      显然,在 onCreate 中执行此操作会中断应用程序,因为 Activity 尚未附加到窗口。如果你这样做:

      @Override
      public void onAttachedToWindow() {
          openOptionsMenu(); 
      };
      

      ...它有效。

      【讨论】:

      • 是的,它有效。但是,最好将super.onAttachedToWindow() 作为函数的第一行。
      【解决方案5】:

      来自名为 MainActivity 的活动中的 OnClickListener:

      MainActivity.this.openOptionsMenu();
      

      【讨论】:

      • 像冠军一样工作。安卓 4.4.2,API 19
      【解决方案6】:

      如果你在你的视图中,你可以写

          ((Activity)getContext()).openOptionsMenu();
      

      【讨论】:

        【解决方案7】:

        对于使用Support Library 的新Toolbar 类的开发人员,可以这样做:

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

        【讨论】:

        • 我在一个带有折叠工具栏和工具栏的活动中这样做,无论我把它放在哪里,它都不起作用,请帮助
        【解决方案8】:

        如果使用 AppCompatActivity

        getSupportActionBar().openOptionsMenu();
        

        【讨论】:

          【解决方案9】:

          经过长期研究和多次尝试,唯一的方法似乎是模拟KeyEvent。这使选项菜单出现:

          BaseInputConnection mInputConnection = new BaseInputConnection( findViewById(R.id.main_content), true);
          KeyEvent kd = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MENU);
          KeyEvent ku = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MENU);
          mInputConnection.sendKeyEvent(kd);
          mInputConnection.sendKeyEvent(ku);
          

          【讨论】:

          • 这里的 main_content 是什么
          【解决方案10】:

          对我来说,在 onClick 中声明 toolbar.showOverflowMenu() 是行不通的。 openOptionsMenu() 也不适合我。而不是以下方式对我有用,

          new Handler().postDelayed(new Runnable() {
                      @Override
                      public void run() {
                          toolbar.showOverflowMenu();
                      }
                  }, 500);
          

          【讨论】:

            【解决方案11】:
            toolbar = (Toolbar) findViewById(R.id.toolbar);
                setSupportActionBar(toolbar);
                toolbar.setTitleTextColor(0xFFFFFFFF);
            
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        toolbar.showOverflowMenu();
                    }
                }, 100);
            

            【讨论】: