70

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

编码:

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

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

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

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

4

12 回答 12

76

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

mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
于 2015-07-27T05:19:54.030 回答
59

从第一个调用setHasOptionsMenu函数onCreate。将onCreateOptionsMenu被自动调用。

试试这个:

setHasOptionsMenu(true)
于 2013-10-18T03:23:58.850 回答
35

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

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

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

于 2012-11-07T10:05:43.710 回答
29

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

setHasOptionsMenu(true);

然后将调用您的方法。

于 2015-08-30T07:58:19.413 回答
16

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

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

首先,您需要在 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>

其次,让你的活动附加它

在 JAVA 中

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

或在科特林

val toolbar = findViewById<Toolbar>(R.id.toolbar)
setSupportActionBar(toolbar)
于 2019-03-21T11:27:00.310 回答
4

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

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

活动菜单

片段菜单

于 2013-12-04T21:53:48.853 回答
3

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

所以我一直在做:

公共类 WelcomeActivity 扩展了 Activity

但将其更改为:

公共类 WelcomeActivity 扩展了 AppCompatActivity

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

于 2016-09-15T11:29:22.720 回答
2

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

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
        /*
          handling event
         */
        return true; //onCreateOptionsMenu won't be invoked.
}
于 2013-10-16T08:17:32.593 回答
2

发生这种情况是因为您在 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>

然后,在活动中,您必须“显示”它:

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

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

于 2021-02-27T23:30:25.753 回答
1

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

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

于 2018-08-29T22:17:02.943 回答
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">

active_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);
于 2019-09-07T11:59:07.307 回答
-3

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

@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);
}
于 2012-11-07T09:54:32.540 回答