如何以编程方式打开选项菜单?
我想以编程方式打开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);