安卓工具栏菜单未显示

36

我想在工具栏中添加一个菜单。

我的ActivityonCreateOptionsMenu方法被调用,但没有菜单出现。

这是来自菜单文件夹的dashboard.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu 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"
      tools:context="com.app.android.ui.dashboard.DashboardActivity">

    <item
        android:id="@+id/action_scan_qr"
        android:icon="@drawable/ic_drawer"
        android:title="@string/menu_scan_qr"
        app:showAsAction="always" />
</menu>

注意: 此菜单的图标颜色比操作栏的背景颜色更暗,因此应该可见。

在 Activity 中填充菜单:

public class DashboardActivity extends ActionBarActivity {

@Override
public boolean onCreateOptionsMenu(final Menu menu) {
    getMenuInflater().inflate(R.menu.dashboard, menu);

    return true;
}

应用程序的主题:

<style name="Theme.Application.Base" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">@android:color/white</item>
        <item name="colorPrimaryDark">@android:color/white</item>
        <item name="android:windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="drawerArrowStyle">@style/Theme.Application.DrawerArrowStyle</item>
        <item name="android:textColorSecondary">@android:color/darker_gray</item>
</style>

为什么调用了 onCreateOptionsMenu,但菜单没有出现。我正在使用 appcompat-v7:21.0.3
编辑:
    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getContentViewId());

        toolbar = (Toolbar) findViewById(R.id.tool_bar);
        if (toolbar == null) {
            throw new Error("Can't find tool bar, did you forget to add it in Activity layout file?");
        }

        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
    }

尝试在你的xml项中添加android:orderInCategory="100" - Skizo-ozᴉʞS ツ
1
你的Activity布局长什么样?它是否包含一个Toolbar视图,并且你是否通过setSupportActionBar(toolbar)将其设置到活动中? - npace
我在从活动布局文件中膨胀工具栏后,使用 setSupportActionBar(toolbar)。 - Procurares
Joan,orderInCategory 没有帮助。 - Procurares
尝试将return true;替换为return(super.onCreateOptionsMenu(menu)); - Skizo-ozᴉʞS ツ
22个回答

1
晚来的回答,希望这能为您节省很多代码。如果您的父级主题是样式而不是Theme.MaterialComponents.DayNight.NoActionBar,则无需将Toolbar添加到XML文件中。如果您在theme.xmlstyle.xml中的父级主题是Theme.MaterialComponents.DayNight.DarkActionBar,此外,您可以为您的活动添加特定的主题。

步骤1:如果不存在,请在res下创建一个menu文件夹,然后创建一个菜单项,即item_menu

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:title="Setting"
        app:showAsAction="always"
        android:icon="@drawable/ic_baseline_settings_24"
        android:id="@+id/action_setting"/>
</menu>

第二步:在您的activity中添加以下方法,以在默认工具栏上显示菜单:

//To show or inflate menu on the toolbar
    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.item_menu, menu)
        return true
    }

第三步: 为了处理点击事件,请添加以下方法。
//Handle the click event on the menu item option
    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when (item.itemId) {
            R.id.action_setting -> {
                //DO YOUR STUFF HERE
            }
        }

        return false
    }

注意:您不需要将工具栏添加到XML文件中。

0

将您想要添加的图标放在mipmap文件夹下

ic_menu_options

创建menu文件夹下的menu_analysis.xml(在values.xml文件中)。
 <?xml version="1.0" encoding="utf-8"?>
<menu 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"
    tools:context="com.app.android.ui.dashboard.DashboardActivity">
         <item
            android:id="@+id/action_scan_qr"
            android:icon="@mipmap/ic_menu_options"
            android:title=""
            app:showAsAction="always" />
</menu>

现在在你的Java类下面有onPrepareOptionMenu

@Override
public boolean onPrepareOptionsMenu(final Menu menu) {
    getMenuInflater().inflate(R.menu.menu_analysis, menu);
    return super.onCreateOptionsMenu(menu);
}

0
在onCreate方法中使用setSupportActionBar(toolbar)。

请在您的回答中考虑添加更多信息。 - Inder

0

虽然已经有一个被接受的答案,但是它会导致我的菜单项渲染两次。因此,我刚刚解决了这个问题,尝试一些东西,例如:

  1. 记得使用 return true; 而不是 super.onCreateOptionsMenu(menu);
  2. 记得设置支持操作栏 setSupportActionBar(findViewById(R.id.toolbar))
  3. 如果您使用自定义工具栏,则可能希望关闭默认应用程序标题:getSupportActionBar().setDisplayShowTitleEnabled(false)

0
在我的情况下,视图重叠,并且点击被另一个视图覆盖。(附注:仔细检查xml)

0
问题在我将其从 app:showAsAction 更改为 android:showAsAction 后得到解决。

不行,当你这样做时,会显示一个错误。 - mufazmi

0
如果什么都不起作用,那么请尝试以下方法:
onCreateView() 方法中添加以下行。
setHasOptionsMenu(true)

还需在 onViewCreated() 方法中添加以下行

(activity as AppCompatActivity?)!!.setSupportActionBar(customToolbar as Toolbar?)

其中customToolBar是在XML文件中添加的工具栏的ID。


0
另一个可以检查并禁用操作栏的地方是您的主题。在Android Studio中,默认情况下提供的是不支持操作栏的Material3浅色主题。请将该主题替换为支持操作栏的主题。您可以在以下位置找到该文件夹:

res/values/themes/themes.xml

在文件中的下一行应该与以下内容在同一行: <style name="Base.Theme.<AppName>" parent="<Material3或其他禁用操作栏的主题>"> 然后,只需将父主题替换为支持操作栏的主题即可。

0

我写了这样的代码:

MenuInflater(this).inflate(R.menu.my_menu, menu)

但是,我已经修改了代码,像这样:

menuInflater.inflate(R.menu.my_menu, menu)

它起作用了!

(我正在使用 Kotlin,这段代码是在 Activity 中编写的)


0

使用XML代码

app:menu="menu_name"

使用Java代码

     public class MainActivity extends AppCompatActivity { 
        
          private Toolbar toolbar;
        
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                toolbar = findViewById(R.id.toolbar);
                setSupportActionBar(toolbar);
        }

@Override
    public boolean onCreateOptionsMenu(Menu menu) 
        getMenuInflater().inflate(R.menu.demo_menu,menu);
        return super.onCreateOptionsMenu(menu);
    }
  }

关于如何在工具栏中添加导航图标、副标题、标题和品牌 logo 的完整文章,您必须仔细阅读https://bedevelopers.tech/android-toolbar-implementation-using-android-studio/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接