2014-04-04 5 views

ответ

4

Вы можете переопределить Activity.onMenuOpened и Activity.onPanelClosed, чтобы определить, когда отображается меню переполнения или других подменю, например ShareActionProvider. Вот пример:

/** True if an options menu has been opened, false otherwise */ 
private boolean mMenuOpened; 

@Override 
public boolean onMenuOpened(int featureId, Menu menu) { 
    mMenuOpened = true; 
    return super.onMenuOpened(featureId, menu); 
} 

@Override 
public void onPanelClosed(int featureId, Menu menu) { 
    super.onPanelClosed(featureId, menu); 
    mMenuOpened = false; 
} 

Альтернативно

AbsActionBarViewActionBarView подклассы, который содержит AbsActionBarView.isOverflowMenuShowing. Поскольку этот класс является внутренним и скрытым, вам нужно получить доступ к нему через отражение.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    final int actionBarViewId = getResources().getIdentifier("action_bar", "id", "android"); 
    final View actionBarView = findViewById(actionBarViewId); 

    actionBarView.postDelayed(new Runnable() { 

     @Override 
     public void run() { 
      System.out.println(isOverflowMenuShowing(actionBarView)); 
     } 
    }, 2500); 
} 

private static boolean isOverflowMenuShowing(View actionBarView) { 
    try { 
     final Class<?> abv = Class.forName("com.android.internal.widget.ActionBarView"); 
     final Method isOverflowShowing = abv.getMethod("isOverflowMenuShowing", new Class[] {}); 
     return (boolean) isOverflowShowing.invoke(actionBarView, new Object[] {}); 
    } catch (final Exception ignored) { 
     // Nothing to do 
    } 
    return false; 
} 
+1

Вы действительно помогли мне. Спасибо! – kirik88

+0

@ kirik88 Приходите, чтобы узнать, я полностью упустил «Activity.onMenuOpened» и «Activity.onPanelClosed». Вам не нужно использовать рефлексию, я обновил свой ответ. – adneal

+0

О, спасибо! Этот метод является более предпочтительным. – kirik88

Смежные вопросы