操作栏溢出菜单的打开/关闭监听器

14

我希望在用户打开/关闭ActionBar溢出菜单(三个点)时能够监听,类似这样的方式:

void onOverflowMenu(boolean expanded) {
}
为了处理打开的菜单,我尝试了 onPrepareOptionsMenu(), 但它会在 ActionBar 被构建或者调用 invalidateOptionsMenu() 时触发。这不是我想要的。
我可以检测用户是否在 onMenuItemSelected() 中选择了一个菜单项以关闭溢出菜单。但我还想在用户通过在溢出菜单外部点击、按下返回键和其他所有情况下关闭溢出菜单时进行检测。
有没有一种方法来实现这个?

尝试检查当您按下溢出菜单时是否触发了onMenuItemSelected()。如果它被触发,您可以调试应用程序并检查需要执行哪些操作以正确捕获该事件。 - zozelfelfo
2个回答

22

为了捕获 Activity 中的打开操作:

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

为了捕获关闭操作,即使用户点击菜单视图之外的区域:

@Override
public void onPanelClosed(int featureId, Menu menu) {
    ...
}

4
谢谢!它起作用了。此外,我添加了一条检查语句 if (featureId == FEATURE_ACTION_BAR) 来确保已触发哪个菜单。 - Dima Kornilov
1
onMenuOpened被触发两次,如果您试图跟踪分析溢出菜单的打开情况,这是不准确的。 - AdamHurwitz
2
请参考正确的解决方案:https://dev59.com/EJ7ha4cB1Zd3GeqPdQ3j当溢出菜单被打开时,onPrepareOptionsMenu()只会被调用一次。 - AdamHurwitz
我们如何检查在片段内使用溢出菜单的类似情况? - Roohi Zuwairiyah

6
在我看来,最简单的方法是设置 ActionBar.OnMenuVisibilityListener
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
    actionBar.addOnMenuVisibilityListener(new ActionBar.OnMenuVisibilityListener() {
        @Override
        public void onMenuVisibilityChanged(boolean isVisible) {
            if (isVisible) {
                // menu expanded
            } else {
                // menu collapsed
            }
        }
    });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接