2014-04-04 16 views

回答

4

您可以覆盖Activity.onMenuOpenedActivity.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; 
} 

或者

ActionBarViewAbsActionBarView包含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