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

JCL*_*oot 23 android android-appcompat android-actionbar

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

那里有很多文档,但它令人困惑,因为它大部分只与非常旧的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"/>
Run Code Online (Sandbox Code Playgroud)

这是我ActivityonCreate()方法

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

myToolbar.showOverflowMenu();
myToolbar.setTitleTextColor(R.color.lightPrimaryText);
Run Code Online (Sandbox Code Playgroud)

我也尝试过膨胀一个菜单xml文件onCreateOptionsMenu(),但这也没有给我我想要的结果.

ear*_*jim 46

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

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>
Run Code Online (Sandbox Code Playgroud)

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

您的主题Activity应该是(或衍生自)其中一个NoActionBar主题(Theme.AppCompat.NoActionBar例如,或者Theme.MaterialComponents.NoActionBar如果您使用的是材质组件).

在你的Activity,设置你的Toolbar:

Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(myToolbar);
Run Code Online (Sandbox Code Playgroud)

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

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

您可以覆盖onOptionsItemSelected()以定义您的onClick行为MenuItem:

@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;
}
Run Code Online (Sandbox Code Playgroud)