Вы можете переопределить 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;
}
Альтернативно
AbsActionBarView
ActionBarView
подклассы, который содержит 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;
}
Вы действительно помогли мне. Спасибо! – kirik88
@ kirik88 Приходите, чтобы узнать, я полностью упустил «Activity.onMenuOpened» и «Activity.onPanelClosed». Вам не нужно использовать рефлексию, я обновил свой ответ. – adneal
О, спасибо! Этот метод является более предпочтительным. – kirik88