永远不会调用onCreateOptionsMenu

时间:2012-11-07 09:43:03

标签: android oncreateoptionsmenu

我在Android中使用选项菜单时遇到了一些麻烦。我之前构建了应用程序,它们都运行良好,但现在菜单没有弹出。

代码:

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

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

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

我在Samsung Galaxy 10.1,API等级15,minSDK 15上使用Android 4.0.4。我错过了什么?

12 个答案:

答案 0 :(得分:62)

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

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

答案 1 :(得分:41)

首先从setHasOptionsMenu致电onCreate功能。 onCreateOptionsMenu将自动调用。

答案 2 :(得分:27)

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

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

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

答案 3 :(得分:20)

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

setHasOptionsMenu(true);

然后将调用您的方法。

答案 4 :(得分:4)

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

如果您在片段中调用此内容,则需要覆盖public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)而不是public boolean onCreateOptionsMenu(Menu menu)Fragments不使用后者,所以他们甚至都不会打电话给它。

Activity menu

Fragment menu

答案 5 :(得分:2)

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

所以我一直在做:

公共类WelcomeActivity扩展了Activity

但改为:

公共类WelcomeActivity扩展了AppCompatActivity

这样我就说可以在您的活动中添加操作栏。

答案 6 :(得分:2)

发生这种情况是因为您在 style.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 创建菜单

答案 7 :(得分:1)

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

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

答案 8 :(得分:0)

我遇到了类似的问题,但是我正在与社区共享一个不同的解决方案(因为花了一个小时才了解正在发生的事情):

    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仅在构建子类时初始化。

答案 9 :(得分:0)

这是因为我们的活动没有工具栏

为了添加它。首先,您需要在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>

第二,让您的活动追加

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

或在科特林

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

答案 10 :(得分:0)

  

如果上述答案不起作用,请确保使用与工具栏相同的 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);

答案 11 :(得分:-2)

试一试这对我有用:---

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