如何将溢出菜单添加到工具栏?

How to add overflow menu to Toolbar?

我正在尝试在我的应用程序中使用 Android ActionBar,并且有一个隐藏在溢出菜单中的选项。

那里有很多文档,但令人困惑,因为其中大部分仅与 Android 的非常旧版本相关,并且当您尝试应用相同的概念时,它们不再起作用或工作方式不同。

这是我的 Activity 布局

<android.support.v7.widget.Toolbar
    android:id="@+id/my_toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:titleTextColor="@android:color/white"
    android:background="@color/colorPrimary"
    android:elevation="4dp"
    android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

这是我的 ActivityonCreate() 方法

// sets up activity toolbar
Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(myToolbar);

myToolbar.showOverflowMenu();
myToolbar.setTitleTextColor(R.color.lightPrimaryText);

我也试过从 onCreateOptionsMenu() 扩展一个菜单 xml 文件,但这也没有给我想要的结果。

res/menu 资源文件夹中为您的 Toolbar 定义一个 Menu,例如:

toolbar_menu.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=".activity.MainActivity">

    <item
        android:id="@+id/action_sign_out"
        android:title="@string/toolbar_sign_out"
        app:showAsAction="never"/>
</menu>

设置 app:showAsAction="never" 确保此 MenuItem 不会显示在 Toolbar 中,而是放在溢出菜单中。

Activity 的主题应该是(或派生自)NoActionBar 主题之一(例如 Theme.AppCompat.NoActionBar,或者 Theme.MaterialComponents.NoActionBar 如果您使用Material Components).

在您的 Activity 中,设置您的 Toolbar:

Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(myToolbar);

并覆盖 onCreateOptionsMenu() 以扩充您之前定义的菜单资源:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.toolbar_menu, menu);
    return true;
}

您可以覆盖 onOptionsItemSelected() 来定义 MenuItem(s):

的 onClick 行为
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_sign_out: {
            // do your sign-out stuff
            break;
        }
        // case blocks for other MenuItems (if any)
    }
    return true;
}

在清单文件中声明

android:theme="@style/AppTheme.NoActionBar"

像这样:

<activity
    android:name=".ActivityName"
    android:label="@string/label"
    android:theme="@style/AppTheme.NoActionBar" />

并将其添加到您的样式中:

 <style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

并在 Activity onCreate() 中调用它:

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

在 activity 中覆盖此方法:

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.product_list, menu);
    //U can find item set icon and stuff...
    MenuItem item= menu.findItem(R.id.action_search);

    return true;
}

并像这样为溢出菜单声明您的菜单:

  <?xml version="1.0" encoding="utf-8"?>
<menu >
    <group>
        <item
            android:id="@+id/sign_out"
            android:title="@string/sign_out" />
        <item
            android:id="@+id/about"
            android:title="@string/about" />
    </group>
</menu>

对于处理项目选择调用这个

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) { 
       case R.id.sign_out:
       //do stuff
           break;
           }  
        return super.onOptionsItemSelected(item);
    }

完成:)

简单操作将此代码复制到您的 MainActivet`

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main2, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            Group gp=(Group)findViewById(R.id.order);

            return true;
        }

        return super.onOptionsItemSelected(item);
    }`

现在为菜单名称创建目录文件继续Android_Studio->应用程序文件夹->Right_Click->新建->目录->现在输入名称菜单创建一个xml文件里面有 menu2.xml 名字

并将此代码添加到 menu2.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">
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:title="@string/action_settings"
        app:showAsAction="never"
        android:icon="@android:drawable/ic_input_add"
        />

</menu>

如有任何疑问请发短信给我