2012-08-17 101 views
4

問題:如果MenuItem(或哪個MenuItems)位於ActionBar的溢出菜單中,是否有辦法檢查代碼? 我正在使用ActionBarSherlock檢查MenuItem是否在ActionBar溢出

我需要這個的原因是因爲我有一堆圖標,如果有空間,它將出現在ActionBar中。我有一個完整的黑暗主題,所以圖標是適合的。

當菜單項被放入溢出菜單時,我的問題就出現了。在Pre-Honeycomb設備上,這意味着它們將在用戶按下菜單按鈕時顯示。這個菜單與我的ActionBar完全相反,我想要一組不同的圖標來適應這種情況。

+1

圖標不顯示在溢出菜單項中。 – superfell 2012-08-17 04:04:48

+0

我知道他們沒有。這不是我要問的。我指出,我對預蜂窩設備感興趣(菜單圖標顯示)。 – Sababado 2012-08-17 14:57:29

+0

如果我們找到了一種方法,可以禁用溢出菜單中的MenuItems上的圖標,這樣只有文本會出現在傳統菜單中。 – 2012-08-21 23:48:20

回答

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; 
} 
+0

這完美解決!謝謝。 – Sababado 2012-08-27 16:05:04

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.** { *; } 
+0

更改此以與'android.support.v7.internal.view.menu.MenuItemImpl'一起使用,但隨後在API 10上得到了'NoSuchMethodException'(即使我正在使用具有該方法的appcompat版本22進行構建)。在API 22上運行時,它會工作,但會給出錯誤的結果(所有的Action/Toolbar圖標被稱爲溢出,即使其中只有一些是...)。 – Matthias 2015-07-07 17:03:49

+0

@Matthias,我更新了代碼。如果您仍然有問題或發現問題,請告訴我。 – 2015-07-07 22:34:02