onCreateOptionsMenu 永远不会被调用

Posted

技术标签:

【中文标题】onCreateOptionsMenu 永远不会被调用【英文标题】:onCreateOptionsMenu is never called 【发布时间】: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",我已经在其他应用上成功使用过。 幽默并尝试将其设置为全息等。 对。在全息中,它确实被调用了。 这可能是相关的:***.com/q/8970083/969325 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

试试这个:

setHasOptionsMenu(true)

【讨论】:

这仅适用于片段。有关选项菜单和片段的许多其他提示和技巧,请参见此处:***.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_
    android:layout_">

    <!-- add this part-->
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_
        android:layout_
        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_
android:layout_
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_
    android:layout_>

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。更改方法的内容将无济于事。

以上是关于onCreateOptionsMenu 永远不会被调用的主要内容,如果未能解决你的问题,请参考以下文章

onCreateOptionsMenu 没有在 Fragment 内被调用

onCreateOptionsMenu()没有在FragmentActivity上调用

应用程序崩溃onCreateOptionsMenu(也许)

IOS:UITextInput 上的 Tokenizer 永远不会被调用

菜单项onCreateOptionsMenu()和onOptionsItemSelected()的使用

QAbstractItemModel data() 永远不会被调用