2012-08-17 4 views
4

질문 : ActionBar의 오버플로 메뉴에 MenuItem (또는 MenuItems)이 있는지 확인하는 방법이 있습니까? ActionBarSherlock을 사용하고 있습니다.MenuItem이 ActionBar 오버플로에 있는지 확인하십시오.

내가 필요한 이유는 방이 있으면 ActionBar에 표시되는 아이콘이 많기 때문입니다. 홀로그램의 어두운 테마가있어서 아이콘이 맞도록 만들어졌습니다.

메뉴 항목을 오버플로 메뉴에 넣으면 문제가 발생합니다. Pre-Honeycomb 기기에서 이것은 사용자가 메뉴 버튼을 눌렀을 때 표시된다는 것을 의미합니다. 이 메뉴는 내 ActionBar와 정반대의 배경이며, 다른 아이콘 세트를 원합니다.

+1

아이콘이 표시되지 않습니다 오버플로 메뉴 항목에서 – superfell

+0

나는 그들이 그렇지 않다는 것을 안다. 그건 내가 묻는 것이 아니야. 나는 프리 허니 콤 장치 (메뉴 아이콘 보여주기)에 관심이 있다고 지적했다. – Sababado

+0

오버 플로우 메뉴에있는 MenuItems의 아이콘을 비활성화하여 기존 메뉴에 텍스트 만 표시되도록하는 방법을 찾으면 도움이 될 것입니다. –

답변

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

0

나는 당신의 문제를 해결하는 비슷한 질문에 대한 답변을 게시를 참조하십시오

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

기본적으로 당신이 할 수 onPrepareOptionsMenu를 사용하여 비 작업 항목 아이콘을 제거하십시오.

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); 
} 

참고 클래스에 다음 코드를 삽입 한 후 호출 : 반사 생산에서 작동, 그래서 당신은 당신의 난독 구성 파일에 다음 줄을 추가해야하는 빌드 :

-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

+0

@Matthias, 코드를 업데이트했습니다. 아직 문제가 있거나 잘못된 것이 있으면 알려주세요. –

관련 문제