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

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

或者只是调用Activity.openOptionsMenu() ?

很显然,在onCreate中这样做会打破应用程序,因为Activity尚未附加到窗口。 如果你这样做:

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

…有用。

对于使用Support Library的新Toolbar类的开发人员,这是如何完成的:

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

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

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

从名为MainActivity的活动中的OnClickListener获取:

 MainActivity.this.openOptionsMenu(); 

如果使用AppCompatActivity

 getSupportActionBar().openOptionsMenu(); 

两种方式来做到这一点:

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

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

或者…通过模拟用户按下button:

 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); 

如果你在你的视野内,你可以写

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

经过长时间的研究和多次尝试,唯一的方法似乎是模拟一个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); 

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

 new Handler().postDelayed(new Runnable() { @Override public void run() { toolbar.showOverflowMenu(); } }, 500); 
 toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); toolbar.setTitleTextColor(0xFFFFFFFF); new Handler().postDelayed(new Runnable() { @Override public void run() { toolbar.showOverflowMenu(); } }, 100);