从不调用 onCreateOptionsMenu

我有一些麻烦得到一个选项菜单在 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。我错过了什么吗?

64035 次浏览

试试这个,它对我很有效

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

如果你测试的手机在 CreateOptionsMenu 上有一个菜单按钮,那么在主题开始时不会调用:

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

但是当你点击菜单按钮时,onCreateOptionsMenu将被调用。我不知道没有硬件按钮的手机会怎么样。

也许您还覆盖了 OnKeyDown方法,使它总是返回 没错。返回 true 意味着将阻止 keyEvent 进一步传播。见下面的代码:

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

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

试试这个:

setHasOptionsMenu(true)

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

如果在片段中调用这个函数,则需要重写 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)而不是 public boolean onCreateOptionsMenu(Menu menu)Fragments不使用后者,所以他们甚至不会调用它。

活动菜单

碎片菜单

在最新版本的 Android 中,当你使用 compat 库作为工具栏时,这种情况很常见,为了让菜单项显示在工具栏中,你必须做到以下几点:

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

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

setHasOptionsMenu(true);

然后将调用您的方法。

我也有同样的问题,我的问题是通过继承一个不同的活动类来解决的。

所以我一直在做:

公共类 WelcomActivity 扩展活动

但是改成了:

公共类 WelcomActivity 扩展了 AppCompatActivity

这样的话,我想说的是,一个动作条可以添加到你的活动中。

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

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

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

要做到这一点有两个步骤。

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

<?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);

或者在 Kotlin

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

如果上面的答案不起作用,请确保您使用的是相同的 < em > 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">

Activy _ 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);

这是因为您已经在 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 创建菜单