点击硬件菜单按钮打开操作栏中的子菜单

18

标题已经解释了一切。我想在单击硬件菜单按钮时打开操作栏中的子菜单。

这是代码,第一次点击菜单时它可以正常工作。每次之后它只是闪烁(打开然后立即关闭)。

private Menu mainMenu;
public boolean onCreateOptionsMenu(Menu menu) {

MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options, menu);
mainMenu = menu;

return true;
}

public boolean onKeyDown(int keyCode, KeyEvent event) {
if(event.getAction() == KeyEvent.ACTION_DOWN){
    switch(keyCode) {
    case KeyEvent.KEYCODE_MENU:

        mainMenu.performIdentifierAction(R.id.more, 0);

        return true;  
    }
}
return super.onKeyDown(keyCode, event);
}

这里是options.xml文件

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item
    android:id="@+id/settings"
    android:icon="@drawable/ic_menu_preferences"
    android:showAsAction="ifRoom|withText"
    android:title="Settings"/>

<item
    android:id="@+id/about"
    android:icon="@drawable/ic_menu_info_details"
    android:showAsAction="ifRoom|withText"
    android:title="About"/>

<item
    android:id="@+id/more"
    android:icon="@drawable/ic_menu_moreoverflow_normal_holo_dark"
    android:showAsAction="always|withText"
    android:title="More">
    <menu>
        <item
    android:id="@+id/changelog"
    android:icon="@drawable/ic_menu_recent_history"
    android:showAsAction="ifRoom|withText"
    android:title="Changelog"/>
        <item
    android:id="@+id/update"
    android:icon="@drawable/ic_menu_refresh"
    android:showAsAction="ifRoom|withText"
    android:title="Update Check"/>
<item
    android:id="@+id/check"
    android:icon="@drawable/ic_menu_help"
    android:showAsAction="ifRoom|withText"
    android:title="Compatibility Check"/>
        </menu> 
        </item>

</menu>

更新:(解决方案) 只需将onKeyDown()方法更改为onKeyUp(),现在它就能正常工作了。


非常感谢您的提问!我一直在寻找解决方案! - Jared Burrows
感谢更新解决方案。 - gorodezkiy
1个回答

6

试试这个:

public boolean onCreateOptionsMenu(Menu menu) 
{
    super.onCreateOptionsMenu(menu);// <--- add this

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options, menu);
    mainMenu = menu;
    return true;
}

//override this method instead of onKeyDown()....
@Override
public boolean onOptionsItemSelected(MenuItem item) 
{
    super.onOptionsItemSelected(item);      

    int menuId = item.getItemId();      
    if(menuId == R.id.settings)
    {
        //do settings   
    }
    //else if(menuId = ...) {....}

    return true;
}

当我点击菜单时,这将如何被调用? - pedja
我已经为每个项目编写了OnOptionsItemSelected,但我想要做的是在点击硬件菜单键打开子菜单时。 - pedja
这是onOptionsItemSelected(MenuItem item)方法为所有菜单项执行的操作。在该方法内部,您可以根据menuId检查所选哪个菜单项(使用if..else或switch..case)。 - Kelvin Trinh
是的,但只有在手动点击时才会打开。我想要在设备上点击菜单键时打开它。 - pedja
如果您在当前活动中实现了onCreateOptionsMenu(Menu menu),则菜单将始终处于打开状态。无需编写代码即可打开它。我不理解您所说的“但只有在手动点击时才会打开”。 - Kelvin Trinh
显示剩余7条评论

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