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上调用
IOS:UITextInput 上的 Tokenizer 永远不会被调用