7

我升级到 4.2 版本,发现我的旧代码没有编译,因为它似乎 ForceOverflow 父主题已被删除。

在谷歌搜索这个问题之后,它似乎被故意删除以保持设备一致的菜单按钮。

我确实理解使用物理菜单按钮的论点,但我只是不同意它......而且那些旧菜单太丑陋了。

我真的不希望用户说他们无法访问以前的功能(这毕竟是菜单按钮被移动到屏幕上可见的原因),那么我在这里有什么选择?这会在未来的版本中改变吗?我是否必须坚持使用以前版本的 ABS 并处理旧 ABS 库中的一些其他错误,这些错误已在最近的版本中修复?有什么解决办法吗?

4

1 回答 1

9

我们可以使用 SubMenu 来伪造它,而不是试图获得一个“真正的”溢出菜单。

它看起来和行为都像原来的溢出按钮,只是更好,因为它会一直在那里。

private Menu mainMenu;
private SubMenu subMenu1;

    @Override
public boolean onCreateOptionsMenu(Menu menu) {

    mainMenu = menu;

    subMenu1 = menu.addSubMenu("");
    subMenu1.add("Settings");
    subMenu1.add("About");
    subMenu1.add("Help");

    MenuItem subMenu1Item = subMenu1.getItem();
    subMenu1Item.setIcon(R.drawable.ic_menu_moreoverflow_normal_holo_dark);
    subMenu1Item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

    return super.onCreateOptionsMenu(menu);
}

当然,您可以像以前一样设置子菜单。使用 groudID、itemID 等。

请注意,我已经选择 *ic_menu_moreoverflow_normal_holo_dark* 作为菜单图标。这样按钮也看起来像一个溢出。

现在我们只需要在用户按下硬件菜单按钮时打开这个子菜单。如果你像我以前那样设置 mainMenu 和 subMenu1,我们可以很容易地做到这一点。

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_MENU) {
            mainMenu.performIdentifierAction(subMenu1.getItem().getItemId(), 0);
            return true;
    }
    return super.onKeyUp(keyCode, event);
}

请注意您导入:

import com.actionbarsherlock.view.SubMenu;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;

不是

import android.view.MenuItem;
于 2012-10-15T01:46:37.893 回答