onOptionsItemSelected 未调用

onOptionsItemSelected not called

我的操作栏中有一个菜单项列表。每个项目点击应该触发不同的方法。但是永远不会调用 onOptionsItemSelected。

这是在 MainActivity 中定义操作栏的方式:

public class MainActivity extends AppCompatActivity {
...
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings_1) {
            //do something
            return true;
        } else if (id == R.id.action_settings_2) {
            //do something
            return true;
        } else if (id == R.id.action_settings_1) {
            //do something
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
...
}

这是操作栏菜单布局menu_main:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.MainActivity">
    <item
        android:id="@+id/action_settings_1"
        android:orderInCategory="1"
        android:title="Item 1"
        app:showAsAction="never" />
    <item
        android:id="@+id/action_settings_2"
        android:orderInCategory="2"
        android:title="Item 2"
        app:showAsAction="never" />
    <item
        android:id="@+id/action_settings_3"
        android:orderInCategory="3"
        android:title="Item 3"
        app:showAsAction="never" />
</menu>

如何设置操作栏以便在单击操作栏项目时调用 onOptionsItemSelected?

在您的 onCreateOptionsMenu 内部,return true 而不是调用 super。应该这样做

只需进行如下更改即可:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

在onCreate()中调用setSupportActionbar(),像这样

toolbar = (Toolbar)findViewById(R.id.main_toolbar);
setSupportActionBar(toolbar);

如果在 XML 中使用 menu 属性,也可能会发生此问题:

        <com.google.android.material.appbar.MaterialToolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?android:attr/actionBarSize"
            app:menu="@menu/your_menu"
            app:navigationIcon="@drawable/..."
            app:title="@string/..." />

因此 app:menu="@menu/your_menu" 不适用于覆盖的片段方法 onOptionsItemSelected。菜单项点击侦听器必须设置为 Toolbar

private fun setMenuClickListener(toolbar: MaterialToolbar) = with(toolbar) {
        setOnMenuItemClickListener { menuItem ->
            if (menuItem.itemId == R.id.yourId) {
                //do something
                return@setOnMenuItemClickListener true
            }
             //this is a lambda so it can be just false,
             //added return to make it explicit
            return@setOnMenuItemClickListener false
        }
    }

所以我们要找的是来自MaterialToolbar

setOnMenuItemClickListener

试试这个:

而不是实施

@Override
public boolean onCreateOptionsMenu
...

在activity_main.xml中添加:

<androidx.appcompat.widget.Toolbar
        android:id="@+id/myToolbar"
        app:title="@string/myTitle"
        app:menu="@menu/menu_main"
        >
</androidx.appcompat.widget.Toolbar>

接下来,在menu_main.xml中添加每一项:

android:onClick="onOptionsItemSelected"

像这样:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.MainActivity">
    <item
        android:id="@+id/action_settings_1"
        android:orderInCategory="1"
        android:title="Item 1"
        app:showAsAction="never"
        android:onClick="onOptionsItemSelected" />
    <item
        android:id="@+id/action_settings_2"
        android:orderInCategory="2"
        android:title="Item 2"
        app:showAsAction="never"
        android:onClick="onOptionsItemSelected" />
    <item
        android:id="@+id/action_settings_3"
        android:orderInCategory="3"
        android:title="Item 3"
        app:showAsAction="never"
        android:onClick="onOptionsItemSelected" />
</menu>