【问题标题】:onCreateOptionsMenu is never calledonCreateOptionsMenu 永远不会被调用
【发布时间】:2012-10-27 08:24:21
【问题描述】:

我在获取在 Android 中运行的选项菜单时遇到了一些问题。我之前构建了应用程序,它们都运行良好,但现在菜单不弹出。

代码:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);

    getMenuInflater().inflate(R.menu.activity_video, menu);
    return true;
}

甚至从不调用整个方法(通过设置断点进行检查)。该活动非常简单,它只有一个VideoView,其中有一个OnTouchListener 集。

我在三星 Galaxy 10.1 上使用 Android 4.0.4,API 级别 15,minSDK 15。我错过了什么吗?

【问题讨论】:

  • 你用的是什么主题?如果您使用全屏,您将不会获得菜单...
  • NoTitleBar: android:theme="@android:style/Theme.Black.NoTitleBar",我已经在其他应用上成功使用过。
  • 幽默并尝试将其设置为全息等。
  • 对。在全息中,它确实被调用了。
  • 这可能是相关的:stackoverflow.com/q/8970083/969325

标签: android oncreateoptionsmenu


【解决方案1】:

在最新版本的Android中,当使用compat library for toolbar时,这种情况很常见,为了让菜单项显示在工具栏中,您必须执行以下操作:

mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);

【讨论】:

    【解决方案2】:

    首先从onCreate 调用setHasOptionsMenu 函数。 onCreateOptionsMenu 将被自动调用。

    试试这个:

    setHasOptionsMenu(true)
    

    【讨论】:

    • 这仅适用于片段。有关选项菜单和片段的许多其他提示和技巧,请参见此处:stackoverflow.com/questions/6279571/…
    • 在使用片段时这对我不起作用。 - 27.12.2017
    【解决方案3】:

    如果您测试的手机有一个菜单按钮 onCreateOptionsMenu 将不会在主题开始时被调用:

    android:theme="@android:style/Theme.Black.NoTitleBar"

    但是当您单击菜单按钮时,onCreateOptionsMenu 将被调用。我不知道没有硬件按钮的手机会发生什么......

    【讨论】:

    • 没有硬件按钮,菜单根本就没有渲染
    • @BartFriederichs 哎哟,但很高兴知道。我希望有什么东西=/
    【解决方案4】:

    在方法中:Fragment#onCreateView(...) 你应该输入:

    setHasOptionsMenu(true);
    

    然后你的方法将被调用。

    【讨论】:

    • 这不是我活动中的方法。
    • 该方法在 Fragment Michael Fulton 的 onCreateView 中被调用。它运作良好......
    • 我之前把它放在 onCreate 中,就像这里建议的那样,但神奇的技巧是将它移到 onCreateView
    【解决方案5】:

    这是因为活动没有工具栏。

    为了做到这一点,有两个步骤。

    首先,您需要在res/layout中的activity.xml中添加工具栏

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout 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"
        android:layout_width="match_parent"
        android:layout_height="match_parent"">
    
        <!-- add this part-->
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary"
            android:minHeight="?attr/actionBarSize"
            android:theme="?attr/actionBarTheme"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
    </android.support.constraint.ConstraintLayout>
    

    其次,让你的activity追加它

    在 JAVA 中

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

    或在 Kotlin 中

    val toolbar = findViewById<Toolbar>(R.id.toolbar)
    setSupportActionBar(toolbar)
    

    【讨论】:

      【解决方案6】:

      我遇到了同样的问题(菜单没有显示,onCreateOptionsMenu 没有被调用)。

      如果你在片段中调用它,你需要覆盖public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) 而不是public boolean onCreateOptionsMenu(Menu menu)Fragments 不要使用后者,所以他们永远不会调用它。

      Activity menu

      Fragment menu

      【讨论】:

        【解决方案7】:

        我有同样的问题。我的问题通过继承不同的活动类解决了。

        所以我一直在做:

        公共类 WelcomeActivity 扩展 Activity

        但将其更改为:

        公共类 WelcomeActivity 扩展 AppCompatActivity

        我的意思是说可以将操作栏添加到您的活动中。

        【讨论】:

          【解决方案8】:

          发生这种情况是因为您在您的 styles.xml 中定义了一个主题,其内容如下:

          <style name="AppTheme" parent="Theme.AppCompat.Light.**NoActionBar**">
          

          您可以手动创建一个工具栏,然后您必须将其添加到您的活动中。

          工具栏视图的 xml 可能类似于:

          <?xml version="1.0" encoding="utf-8"?>
          <androidx.appcompat.widget.Toolbar
          xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          android:layout_height="wrap_content"
          android:layout_width="match_parent"
          android:minHeight="?attr/actionBarSize"
          android:background="?attr/colorPrimary"
          android:elevation="4dp"
          android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
          app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
          </androidx.appcompat.widget.Toolbar>
          

          然后,在 Activity 中,你必须“显示”它:

          Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
          setSupportActionBar(toolbar);
          ActionBar actionBar = getSupportActionBar();
          if (actionBar != null) {
              actionBar.setDisplayShowTitleEnabled(false);
          }
          

          现在,您可以使用已知的 onCreateOptionsMenu 创建菜单

          【讨论】:

          • 我认为actionBar.setDisplayShowTitleEnabled(false); 会导致我工具栏上的标题消失,但事实并非如此。另外,这解决了我的问题!
          【解决方案9】:

          也许您还覆盖了 onKeyDown 方法并使其始终返回 true。返回 true 意味着 keyEvent 将被阻止进一步传播。见以下代码:

          @Override
          public boolean onKeyDown(int keyCode, KeyEvent event) {
                  /*
                    handling event
                   */
                  return true; //onCreateOptionsMenu won't be invoked.
          }
          

          【讨论】:

            【解决方案10】:

            我遇到了类似的问题,但我与社区分享了一个不同的解决方案(因为我花了一个小时才明白发生了什么):

                abstract class BaseActivity : AppCompatActivity{
                  override fun onCreate(savedInstanceState: Bundle?) {
                  setSupportActionBar(my_toolbar)
                  }
                }
                class MyActivity : BaseActivity{
                    // TODO : some good stuff
                }
            

            其中 my_toolbar 是通过 dataBinding 在我的 xml 文件中创建的对象。

            问题看起来一样,没有工具栏出现,没有调用 onCreateOptionsMenu。

            我的解决方案是将此代码提升到子类而不是基本代码,因为 my_toolbar 仅在构建子类时初始化。

            【讨论】:

              【解决方案11】:

              如果上述答案不起作用,请确保您使用的是相同的 id 工具栏。

              layout_app_bar.xml

              <androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
                  xmlns:app="http://schemas.android.com/apk/res-auto"
                  android:id="@+id/toolbar"
                  android:layout_width="match_parent"
                  android:layout_height="?attr/actionBarSize">
              

              activiy_main.xml

              <include
                  android:id="@+id/app_bar"
                  layout="@layout/layout_app_bar" />
              

              在java文件中:

              不要打电话:

              Toolbar tb = findViewById(R.id.toolbar);
              

              请致电:

              Toolbar tb = findViewById(R.id.app_bar);
              

              【讨论】:

                【解决方案12】:

                试试这个它对我有用:---

                @Override
                public boolean onCreateOptionsMenu(Menu menu)
                {
                    super.onCreateOptionsMenu(menu);
                    getMenuInflater().inflate(R.menu.home_page_menu, menu);
                    return true;
                }
                @Override
                public boolean onOptionsItemSelected(MenuItem item) {
                
                    switch (item.getItemId()) {
                    case R.id.menu_delete:
                        Toast.makeText(this, "You pressed the Delete!",
                                 Toast.LENGTH_LONG).show();
                        break;
                
                
                      case R.id.menu_setting:
                     Intent intent=new Intent(HomePage.this,Setting.class);
                     startActivity(intent);
                     finish();
                     Toast.makeText(this, "You pressed the Setting!",
                     Toast.LENGTH_LONG).show(); break;
                
                
                    }
                
                    return super.onOptionsItemSelected(item);
                }
                

                【讨论】:

                • OP 说永远不会调用 onCreateOptionsMenu。更改方法的内容将无济于事。
                猜你喜欢
                • 2021-06-21
                • 2013-10-12
                • 2012-03-27
                • 2013-08-29
                • 2013-11-03
                • 1970-01-01
                • 1970-01-01
                • 2015-05-06
                • 2015-10-15
                相关资源
                最近更新 更多