检查MenuItem是否在ActionBar溢出中

时间:2012-08-17 03:07:29

标签: android overflow actionbarsherlock menuitem

问题:如果MenuItem(或哪些MenuItems)位于ActionBar的溢出菜单中,是否有办法检入代码? 我正在使用ActionBarSherlock

我需要这个的原因是因为如果有空间,我会在ActionBar中显示一堆图标。我有一个全黑暗的主题,所以图标是适合的。

将菜单项放入溢出菜单时出现问题。在Pre-Honeycomb设备上,这意味着他们将在用户按下菜单按钮时显示。这个菜单与我的ActionBar背景完全相反,我希望有一套不同的图标来适合它。

3 个答案:

答案 0 :(得分:3)

我可能已经找到了解决此问题的方法:在设计指南(here)中,有一个表格,显示根据下降宽度显示的操作栏项目数。

根据该表,我编写了以下代码:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem search = menu.findItem(R.id.menu_search);

    // Get width in dp
    DisplayMetrics metrics = new DisplayMetrics();
    Display display = getWindowManager().getDefaultDisplay();
    display.getMetrics(metrics);
    float logicalDensity = metrics.density;
    int dp = (int) (display.getWidth() / logicalDensity + 0.5);

    if (dp < 360) { // only two icons
        search.setIcon(R.drawable.ic_menu_search);  // Show menu icon for pre-3.0 menu
    } else {
        search.setIcon(R.drawable.ic_action_search); // Show action bar icon for action bar
    }

    return true;
}

答案 1 :(得分:0)

我发布了一个类似问题的答案,可以解决您的问题,请参阅:

https://stackoverflow.com/a/18884872/1299562

基本上,您可以使用onPrepareOptionsMenu删除非操作项图标。

答案 2 :(得分:0)

您可以使用反射。将以下代码放在一个类中,然后调用Foo.isInOverflow(yourMenuItem);

protected static final String SUPPORTCLASS = "android.support.v7.internal.view.menu.MenuItemImpl";

protected static final String NATIVECLASS = "com.android.internal.view.menu.MenuItemImpl";

protected static Method sSupportIsActionButton;

protected static Method sNativeIsActionButton;

static {
    try {
        Class<?> MenuItemImpl = Class.forName(NATIVECLASS);
        sNativeIsActionButton = MenuItemImpl.getDeclaredMethod("isActionButton");
        sNativeIsActionButton.setAccessible(true);
    } catch (Exception ignored) {
    }
    try {
        Class<?> MenuItemImpl = Class.forName(SUPPORTCLASS);
        sSupportIsActionButton = MenuItemImpl.getDeclaredMethod("isActionButton");
        sSupportIsActionButton.setAccessible(true);
    } catch (Exception ignored) {
    }
}

// --------------------------------------------------------------------------------------------

/**
 * Check if an item is showing (not in the overflow menu).
 * 
 * @param item
 *            the MenuItem.
 * @return {@code true} if the MenuItem is visible on the ActionBar.
 */
public static boolean isActionButton(MenuItem item) {
    switch (item.getClass().getName()) {
    case SUPPORTCLASS:
        try {
            return (boolean) sSupportIsActionButton.invoke(item, (Object[]) null);
        } catch (Exception e) {
            // fall through
        }
    case NATIVECLASS:
        try {
            return (boolean) sNativeIsActionButton.invoke(item, (Object[]) null);
        } catch (Exception e) {
            // fall through
        }
    default:
        return true;
    }
}

/**
 * Check if an item is in the overflow menu.
 * 
 * @param item
 *            the MenuItem
 * @return {@code true} if the MenuItem is in the overflow menu.
 * @see #isActionButton(MenuItem)
 */
public static boolean isInOverflow(MenuItem item) {
    return !isActionButton(item);
}

注意:您需要将以下行添加到proguard配置文件中,以便反射在生产版本中起作用:

-keep public class android.support.v7.internal.view.menu.** { *; }