【问题标题】:onOptionsItemSelected not calledonOptionsItemSelected 未调用
【发布时间】:2022-02-03 07:16:21
【问题描述】:

我的操作栏中有一个菜单项列表。每次单击项目都应触发不同的方法。但永远不会调用 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?

【问题讨论】:

    标签: android android-actionbar android-appcompat appcompatactivity


    【解决方案1】:

    在您的 onCreateOptionsMenu 中,返回 true 而不是调用 super。应该这样做

    【讨论】:

    • 这个覆盖方法没有返回布尔类型
    • 这个在Activity上。 Fragment 上的返回类型为 void
    • ListActivity 怎么样,我试过不行
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      只需进行如下更改:

      @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;
      }
      

      【讨论】:

      • 找不到R.menu 也找不到menu_main 它在哪里
      【解决方案4】:

      如果在 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
              }
          }
      

      所以我们正在寻找来自MaterialToolbarsetOnMenuItemClickListener

      【讨论】:

        【解决方案5】:

        试试这个:

        而不是实施

        @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>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多