如何以编程方式打开选项菜单?

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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);

【讨论】:

以上是关于如何以编程方式打开选项菜单?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式调用浏览器右键单击菜单选项?

如何以编程方式关闭 UIWebView 的上下文菜单?

Excel 如何实现五级下拉菜单联动

如何以编程方式更改 Access 中的选项?

如何在不同的选项卡/窗口中打开选择标签(下拉菜单)的选项?

如何以编程方式使文本可选择并提供弹出菜单以转到另一个应用程序