我在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。我错过了什么?
答案 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
不使用后者,所以他们甚至都不会打电话给它。
答案 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);
}