android - OptionsMenu 在 Android 4.1 上只打开一次

标签 android android-optionsmenu

我正在使用此代码将选项菜单作为弹出窗口打开:

@Override
public boolean onPrepareOptionsMenu(Menu menu){
    openMenu();
    return true;
}

private void openMenu(){
    View popUpView = getLayoutInflater().inflate(R.layout.menu, null);
    popUpMenu = new PopupWindow(popUpView, LayoutParams.FILL_PARENT
                                        , LayoutParams.WRAP_CONTENT
                                        , true);
    popUpMenu.setBackgroundDrawable(new BitmapDrawable());
    popUpMenu.setAnimationStyle(android.R.style.Animation_Dialog);
    popUpMenu.showAtLocation(popUpView, Gravity.BOTTOM, 0, 0);
    makePopUpMenuButtons(popUpView);
}

问题是,在 Android 4.1 上,菜单只打开一次。 我读了一些关于 invalidateOptionsMenu() 的内容,但我不知道在哪里实现这个方法。 eclipse 还说“方法 invalidateOptionsMenu() 未在...上定义”。

有谁知道如何在每次单击菜单按钮时打开选项菜单?

编辑:

我不使用 android 菜单对象,因为我想要自定义设计。这就是我在 onPrepareOptionsMenu 中创建弹出窗口的原因。所以我不使用 onOptionsItemSelected。我的问题是 onPrepareOptionMenu 只在第一次点击时被调用,之后只是不规则的。

On Android 3.0 and higher, the options menu is considered to always be open when menu items are presented in the action bar. When an event occurs and you want to perform a menu update, you must call invalidateOptionsMenu() to request that the system call onPrepareOptionsMenu().

这一段说当我的 API 是 3.0 或更高版本时我必须调用 invalidateOptionsMenu。但在我的项目中,API 低于 4.1 时一切正常。我试图在显示弹出窗口后调用 invalidateOptionsMenu,但 eclipse 给出了一个错误,因为该方法未定义...

最佳答案

下面会让事情更清楚:

<强>1。 onCreateOptionsMenu()

要为 Activity 指定选项菜单,您需要覆盖 onCreateOptionsMenu()。在此方法中,您可以将菜单资源(以 XML 定义)扩展到回调中提供的菜单中。 对于 Android 2.3.x 及更低版本,系统会在用户首次打开菜单时调用 onCreateOptionsMenu() 创建选项菜单。但是对于 Android 3.0 及更高版本,系统会在启动 Activity 时调用 onCreateOptionsMenu(),以便向操作栏显示项目。

系统调用onCreateOptionsMenu()后,它会保留您填充的Menu的一个实例,不会再次调用onCreateOptionsMenu(),除非菜单因某种原因失效.但是,您应该仅使用 onCreateOptionsMenu() 来创建初始菜单状态,而不是在 Activity 生命周期中进行更改。

<强>2。 onOptionsItemSelected()

当您从选项菜单中选择一个项目时,系统会调用您 Activity 的 onOptionsItemSelected() 方法。此方法传递选定的 MenuItem。

<强>3。 onPrepareOptionsMenu()

如果您想根据 Activity 生命周期中发生的事件修改选项菜单,您可以在 onPrepareOptionsMenu() 方法中执行此操作。此方法将 Menu 对象传递给您,因为它当前存在,因此您可以修改它,例如添加、删除或禁用项目。

Android 2.3.x 和更低版本 上,每次用户打开选项菜单(按下菜单按钮)时,系统都会调用 onPrepareOptionsMenu()

Android 3.0 及更高版本 上,当菜单项显示在操作栏中时,选项菜单被视为始终打开。当事件发生并且您想要执行菜单更新时,您必须调用 invalidateOptionsMenu() 以请求系统调用 onPrepareOptionsMenu()

对于 invalidateOptionsMenu() Refer this

对于 onPrepareOptionsMenu() Refer this

因此您可以尝试如下操作:

为了处理向后兼容性,请在您的 Activity 中添加以下内容。

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.Menu1:
            refreshMenu();
            break;
        case R.id.Menu2:
            refreshMenu();
            break;     
        }
        return super.onOptionsItemSelected(item);
    }

   public void refreshMenu() {
      if (Build.VERSION.SDK_INT >= 11) {
          invalidateOptionsMenu();
      }
   }

您也可以refer this

关于android - OptionsMenu 在 Android 4.1 上只打开一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18514311/

相关文章:

android - 根据打开的 fragment 更改操作栏中的选项菜单图标

android - 如何在 Android Google Maps API v2 上管理多边形的 InfoWindows

java - 将位图编码和解码为base64,最终的位图只是全黑

android-asynctask - 如果从内部调用 API,onPrepareOptionsMenu 的行为会很奇怪

android - 为 Activity 或分别为每个 fragment 制作一个工具栏?

java - 在选项菜单上单击监听器

android - 在 Android 中关闭方向更改的选项菜单

android - Viewpager 内部有多个 View ,如 "Pulse"应用程序条

android - 时间戳:如何识别CPU命令到达声卡的时间?

android - VideoView/MediaPlayer 在最后一帧停止