【发布时间】:2011-03-09 04:18:50
【问题描述】:
我想以编程方式打开 optionsMenu,而无需用户单击菜单键。我该怎么做?
【问题讨论】:
标签: android button menu android-activity
我想以编程方式打开 optionsMenu,而无需用户单击菜单键。我该怎么做?
【问题讨论】:
标签: android button menu android-activity
两种方法:
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);
【讨论】:
还是直接拨打Activity.openOptionsMenu()?
【讨论】:
把这行代码放在你的 onResume() 中,这应该会有帮助!
new Handler().postDelayed(new Runnable() {
public void run() {
openOptionsMenu();
}
}, 1000);
【讨论】:
显然,在 onCreate 中执行此操作会中断应用程序,因为 Activity 尚未附加到窗口。如果你这样做:
@Override
public void onAttachedToWindow() {
openOptionsMenu();
};
...它有效。
【讨论】:
super.onAttachedToWindow() 作为函数的第一行。
来自名为 MainActivity 的活动中的 OnClickListener:
MainActivity.this.openOptionsMenu();
【讨论】:
如果你在你的视图中,你可以写
((Activity)getContext()).openOptionsMenu();
【讨论】:
对于使用Support Library 的新Toolbar 类的开发人员,可以这样做:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.showOverflowMenu();
【讨论】:
如果使用 AppCompatActivity
getSupportActionBar().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);
【讨论】: