openOptionsMenu函数在ICS中不起作用?

Ric*_*ard 15 android android-menu android-actionbar

我正在使用动作栏兼容性库.我试图从一个带有openOptionsMenu()函数的按钮打开选项菜单,但它什么也没做.

按下手机上的菜单键时,菜单会照常显示.这有什么不对?

public class ReadActivity extends ActionBarActivity {

    ...

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        boolean value;
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.read, menu);
        value = super.onCreateOptionsMenu(menu);

        if (Helper.SupportsNewApi()) {
            getActionBar().hide();
        } else {
            ((View) ((LinearLayout) findViewById(R.id.actionbar_compat))
                    .getParent()).setVisibility(View.GONE);
        }

        return value;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            finish();
            break;
        case R.id.menu_search:
            // Toast.makeText(this, "Tapped search", Toast.LENGTH_SHORT).show();
            break;
        case R.id.menu_bookmark:
            // selectText();
            // setFullScreen(false);
            break;
        case R.id.menu_day_night_mode:
            break;
        case R.id.menu_settings:
            break;
        case R.id.menu_zoom_in:
            showOverlay(false);
            break;
        case R.id.menu_zoom_out:
            showOverlay(false);
            break;
        case R.id.menu_table_of_contents:
            Intent tocIntent = new Intent(this, TocActivity.class);
            int GET_SECTION_REFERENCE = 1;
            startActivityForResult(tocIntent, GET_SECTION_REFERENCE);
            break;
        case R.id.menu_overflow:
            Toast.makeText(this, "Tapped overflow", Toast.LENGTH_SHORT).show();

            //closeOptionsMenu();
            openOptionsMenu(); //tried the below aswell, no results
            //getWindow().openPanel(Window.FEATURE_OPTIONS_PANEL, null);
            break;
        }
        return super.onOptionsItemSelected(item);
    }


    @Override //disable volume buttons
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (!menuShown && (keyCode == 25 || keyCode == 24)) {
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        Log.d(tag, "Keycode is = "+keyCode);
        if (keyCode == 82) {
            if (!menuShown) {
                //openOptionsMenu();
                showOverlay(true);
            } else {
                showOverlay(false);
            }


                    //don't want it to open when pressing menu
            return true;
        } else if (keyCode == 4 && menuShown) {
            showOverlay(false);
            return true;
        } else if (keyCode == 25 && !menuShown) {
            prevPage();
            return true;
        } else if (keyCode == 24 && !menuShown) {
            nextPage();
            return true;
        }

        return super.onKeyUp(keyCode, event);
    }

}
Run Code Online (Sandbox Code Playgroud)

小智 32

我在尝试绕着这个openOptionsMenu的东西遇到同样的问题,我正在做的应该在Android 1.6及更高版本上运行的应用程序.根据Werner Van Belle的回答,我得出结论,我们可以找到解决问题的解决方法.所以我提出了以下代码,当人们没有将方法标记为final时,它总是很美,所以我们总是可以覆盖它.如果您不想放弃将应用程序定位到最新的api(android:targetSdkVersion ="17"),那将是完美的.我希望你们喜欢.:)

@Override
public void openOptionsMenu() {

    Configuration config = getResources().getConfiguration();

    if((config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) 
            > Configuration.SCREENLAYOUT_SIZE_LARGE) {

        int originalScreenLayout = config.screenLayout;
        config.screenLayout = Configuration.SCREENLAYOUT_SIZE_LARGE;
        super.openOptionsMenu();
        config.screenLayout = originalScreenLayout;

    } else {
        super.openOptionsMenu();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 怎么_can_这个有用吗?您不能简单地修改配置变量.当您调用父super.openOptionsMenu时,它仍将检索自己的资源,这将告诉它再次是一个大屏幕.所以我想知道你是否真的测试了这个?如果是这样,它确实有效...那么我很确定它不应该像那样工作,它可能随时都会破坏. (2认同)
  • 我讨厌Android打破了诸如菜单之类的基本功能,简直就是一时兴起。是的,我知道Action Bar是未来的方式,但是我有正当理由不能使用它。最重要的是,我比Android开发人员更了解我的应用的外观和感觉。菜单对我来说一直很好,直到最近为止。由于菜单损坏,我一直在向客户付款。他们所要做的就是*不*打破它。 (2认同)

小智 9

为了揭示谷歌这一悲惨的发展.谷歌显然希望每个人都拥抱新的ActionBar.他们可以通过使ActionBar 比旧的菜单系统更容易使用来实现这一点.然而,这并不是他们计划过渡的方式.不,他们认为通过使旧菜单无法使用但没有提供适当的向后兼容性而对harras程序员有意义.

下面是从com.android.internal.policy.impl获取的代码,它应该创建optionsMenu面板.如您所见,代码只是拒绝创建选项Panel.尽管如此,这种能力显然存在.所以,回答你的问题:忘了它,谷歌不希望你再使用那个optionsPanel.

 // Don't open an options panel for honeycomb apps on xlarge devices.
 // (The app should be using an action bar for menu items.)
 if (st.featureId == FEATURE_OPTIONS_PANEL) {
            Context context = getContext();
            Configuration config = context.getResources().getConfiguration();
            boolean isXLarge = (config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) ==
                    Configuration.SCREENLAYOUT_SIZE_XLARGE;
            boolean isHoneycombApp = context.getApplicationInfo().targetSdkVersion >=
                    android.os.Build.VERSION_CODES.HONEYCOMB;

            if (isXLarge && isHoneycombApp) {
                return;
            }
        }
Run Code Online (Sandbox Code Playgroud)

  • 谷歌似乎再一次认为可用性是借口,但不是议程.做得好,挖掘出来并启发我们. (2认同)

Wot*_*tah 3

我不确定这有多相关,但我发现的这个论坛帖子似乎正在回答您同样的问题。

我希望这篇文章足以解决您的问题。

祝你好运!

  • 它是相关的,但答案应该包含一个答案,而不仅仅是指向另一个站点上的答案的链接。 (6认同)
  • 以防万一有人仍在寻找,这就是该论坛帖子中的真正答案“也许 Android 团队的您应该制作一个跨设备工作的一致 API,这样我们就不能每次发布和更改行为时都搬起石头砸自己的脚或者突然添加一些巨大的新东西。” (2认同)