2010-06-28 77 views
55

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

+0

也许英语不是你的母语,但我真的觉得你掉你的问题可以回答太多的话。请尝试编辑。 – 2010-06-28 14:42:56

回答

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

我认为你的答案是最好的,因为openOptionsMenu()会导致应用程序在HTC One和Sony Xperia Acro上崩溃,而你的解决方案可以避免这一点...所以谢谢yOu – 2013-09-24 08:34:29

+0

IWindowManager不是SDK的公共部分。你有没有得到它的参考? – 2015-06-23 01:42:14

86

或者只需要调用Activity.openOptionsMenu()

+1

是否可以在Activity的oncreate()方法中执行此语句? – Vikas 2011-04-12 04:57:09

+0

@Vikas。将它放在onAttachedToWindow()中,如下面的Kovac所述。 – 2012-11-01 12:03:26

+2

不工作,我有自定义视图在操作栏,并在childview onClick我打电话打开/关闭optionMenu,也与super.open/close 不工作,任何想法,我错了, – 2014-05-18 10:05:23

11

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

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

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

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

...它的工作原理。

+8

是的,它的工作原理。但是,将'super.onAttachedToWindow()'作为函数的第一行会更好。 – 2012-11-01 21:54:02

6

从OnClickListener的活动中调用MainActivity:

MainActivity.this.openOptionsMenu(); 
+0

不适用于我的API20。它什么也没做。 – 2014-09-04 01:22:56

+0

但是这个工程:http://stackoverflow.com/a/17903128/1483390 – 2014-09-04 01:32:26

0

如果你是一个视图中,您可以使用新的ToolbarSupport Library的写

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

对于开发商来说,这是如何完成的:

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

谢谢你,节省了我的时间。 – 2016-05-09 21:06:39

+0

即时通讯在一个具有折叠工具栏以及工具栏的活动中执行此操作,并且它无法工作4me,无论我放在哪里,plz帮助 – Manny265 2016-09-18 23:25:44

+0

工具栏工具栏=(工具栏)findViewById(R.id.action_bar); toolbar.showOverflowMenu(); – Abhijit 2016-11-19 09:56:37

5

if usi NG AppCompatActivity

getSupportActionBar().openOptionsMenu(); 
+0

谢谢你,为我工作。 – 2016-12-04 06:01:19

+0

对我来说只是“openOptionsMenu();”做了诀窍.. – 2017-04-17 01:42:24

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

什么是main_content这里 – LoveForDroid 2017-03-16 15:55:22

0

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

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

    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      toolbar.showOverflowMenu(); 
     } 
    }, 100); 
相关问题