检测点击操作栏溢出菜单按钮

7

我可以检测操作栏菜单按钮的点击/轻触吗?即用于显示溢出菜单项的按钮?

默认情况下,它会打开一个带有一个“设置”项目的列表。以下是截图:

到目前为止,它可以检测到“2”的点击,但我想检测“1”的点击。

4个回答

15

为了检测溢出菜单的点击,可以使用以下代码:

@Override
public boolean onMenuOpened(int featureId, Menu menu) {
    if(featureId == AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR && menu != null){
        //overflow menu clicked, put code here...
    }
    return super.onMenuOpened(featureId, menu);
}

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

为了检测菜单项的点击,如果您有这样的菜单:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu2" android:alphabeticShortcut="b"
        android:title="Menu No. 2" android:orderInCategory="2">
        <menu >
        <group android:id="@+id/group2" android:checkableBehavior="single">
            <item android:id="@+id/submenu1" android:title="SubMenu No. 1" />
            <item android:id="@+id/submenu2" android:title="SubMenu No. 2" />
        </group>  
        </menu>
    </item>
</menu>

你应该能够在

onOptionsItemSelected

中检测到点击。

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    Log.w("ANDROID MENU TUTORIAL:", "onOptionsItemSelected(MenuItem item)");

    // Handle item selection
    switch (item.getItemId()) {
    case R.id.menu2:
        Toast.makeText(this, "Clicked: Menu No. 2", Toast.LENGTH_SHORT).show();
        return true;   
        ...
}

你想要检测Android中溢出菜单的点击:http://developer.android.com/reference/android/view/Window.Callback.html#onMenuOpened%28int,%20android.view.Menu%29 - FR073N
2
如果您使用AppCompatActivity,则常量为AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR。我对这个问题真的很疯狂。 - AlvaroSantisteban

1
最后我找到了解决方法。重写FragmentActivity.onKeyDown函数。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub
    switch (keyCode) {

    case KeyEvent.KEYCODE_MENU:
        // Do Sometihng
        break;

    default:
        break;
    }
    return super.onKeyDown(keyCode, event);
} 

0
如果您已经正确设置了工具栏和菜单,只需在MainActivity中使用这两个函数即可。
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
    //Perform some action on menu open
    return super.onMenuOpened(featureId, menu);
}

@Override
public void onPanelClosed(int featureId, Menu menu) {
    //Perform some action on menu closed
}

MainActivityonCreate函数中设置工具栏。
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

解析XML文件中定义的菜单并展开菜单

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.my_menu, menu);
    return true;
}

my_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/action_something"
        android:title="@string/something_text" />
    <!--Other menu items-->
</menu>

0

默认情况下,单击溢出按钮会显示选项菜单,因此我认为您应该能够拦截事件,然后通过覆盖Activity.onPrepareOptionsMenu来执行所需操作。

这有点棘手,因为我找不到溢出按钮的ID,所以我使用了这个技巧。 在您的Activity中:

private boolean actionBarClicked = false;

@Override
public boolean onOptionsItemSelected (MenuItem item) {
    if (item.getId() == )
        actionBarClicked = true;
    return false; // Let default processing occur
}

@Override
public boolean onPrepareOptionsMenu (Menu menu) {
    if (actionBarClicked) {
        // Overflow button of ActionBar was clicked, do what you want here.
        actionBarClicked = false;
    }
    ...
}

if (item.getId() == ) 是什么意思? :) - Seraphim's
似乎缺少了 null 或空字符串。 - Antoine Marques

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