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

57
我希望您能够编写代码,以使得在不需要用户点击菜单键的情况下,程序能够自动打开选项菜单。请问应该如何实现?
11个回答

94

1
在Activity的onCreate()方法中执行这个语句是可能的吗? - Vikas
@Vikas。按照Kovac的描述,在onAttachedToWindow()中放置它。 - Stephen Hosking
2
无法工作,我在操作栏中使用了自定义视图,并在子视图上的 onClick 中调用了 open/close optionMenu,同时使用 super.open/close。任何想法这里出了什么问题吗? - Abdul Wahab
1
如何在 Fragment 中实现这个? - Kartiikeya

33

显然,在onCreate方法中这样做会导致应用程序出错,因为Activity还未附加到窗口。正确的做法如下:

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

...它有效。


9
可以的。不过,将 super.onAttachedToWindow() 作为函数的第一行会更好。 - Stephen Hosking

16

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

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

我正在使用可折叠的工具栏和工具栏在一个活动中进行操作,但无论我把它放在哪里都不起作用,请帮忙。 - Manny265

11

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

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

9

在名为MainActivity的活动内部的OnClickListener中:

MainActivity.this.openOptionsMenu();

运行得非常好。Android 4.4.2,API 19。 - cliff2310

4
如果使用AppCompatActivity
getSupportActionBar().openOptionsMenu();

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

我认为你的答案是最好的,因为在HTC One和Sony Xperia Acro上使用openOptionsMenu()会导致应用程序崩溃,而你的解决方案避免了这一点...所以谢谢你。 - Muhannad A.Alhariri
IWindowManager 不是 SDK 的公共部分。你是怎么获取它的引用的? - Andrew S

0

如果你在你的视图内部,你可以写

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

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

2
这里的 main_content 是什么? - LoveForDroid

-1
对我来说,在 onClick 中声明 toolbar.showOverflowMenu() 不起作用。 openOptionsMenu() 对我也不起作用。 相反,以下方法对我有用:
new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                toolbar.showOverflowMenu();
            }
        }, 500);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接