You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Drawer Toggle Button的左右两侧添加Options Menu?

实现Toolbar左右两侧都显示Options Menu(同时保留Drawer Toggle)

嘿,这个需求其实不难实现,核心是利用menu item的排序属性和Toolbar的布局逻辑,让左侧菜单项排在Drawer Toggle之后,右侧保持默认位置。下面一步步来:

第一步:准备Menu资源文件

先在res/menu/目录下创建你的菜单文件(比如menu_main.xml)。这里的关键是给左侧要显示的菜单项设置较小的orderInCategory值(比如1、2),右侧的设置较大的值(比如100、101),这样系统会自动把小数值的项排在Toolbar左侧(Drawer Toggle右边),大数值的留在右侧。同时记得设置showAsAction="always",确保它们直接显示在Toolbar上,不会藏进溢出菜单。

示例代码:

<?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">

    <!-- 左侧菜单项:order值小,排在Drawer Toggle后面 -->
    <item
        android:id="@+id/action_left_search"
        android:icon="@drawable/ic_search"
        android:title="Search"
        app:showAsAction="always"
        android:orderInCategory="1"/>

    <item
        android:id="@+id/action_left_filter"
        android:icon="@drawable/ic_filter"
        android:title="Filter"
        app:showAsAction="always"
        android:orderInCategory="2"/>

    <!-- 右侧菜单项:order值大,默认在右侧 -->
    <item
        android:id="@+id/action_right_settings"
        android:icon="@drawable/ic_settings"
        android:title="Settings"
        app:showAsAction="always"
        android:orderInCategory="100"/>

    <item
        android:id="@+id/action_right_profile"
        android:icon="@drawable/ic_profile"
        android:title="Profile"
        app:showAsAction="always"
        android:orderInCategory="101"/>

</menu>

第二步:在Activity中配置Toolbar和Drawer Toggle

接下来在你的Activity里,先把Toolbar设为ActionBar,再初始化DrawerLayout和Drawer Toggle,最后加载刚才的菜单。这里要注意,Drawer Toggle会自动占据Toolbar的最左侧位置,而我们设置了小order值的菜单项会自动排在它右边,完美契合需求。

Java示例代码:

public class MainActivity extends AppCompatActivity {
    private DrawerLayout drawerLayout;
    private ActionBarDrawerToggle drawerToggle;
    private Toolbar toolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化Toolbar并设为ActionBar
        toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        // 配置DrawerLayout和Toggle
        drawerLayout = findViewById(R.id.drawer_layout);
        drawerToggle = new ActionBarDrawerToggle(
                this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawerLayout.addDrawerListener(drawerToggle);
        drawerToggle.syncState();
    }

    // 加载菜单
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    // 处理菜单点击事件
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        // 先处理Drawer Toggle的点击
        if (drawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        // 再处理各个菜单项的点击
        switch (item.getItemId()) {
            case R.id.action_left_search:
                Toast.makeText(this, "左侧搜索按钮被点击", Toast.LENGTH_SHORT).show();
                return true;
            case R.id.action_left_filter:
                Toast.makeText(this, "左侧筛选按钮被点击", Toast.LENGTH_SHORT).show();
                return true;
            case R.id.action_right_settings:
                Toast.makeText(this, "右侧设置按钮被点击", Toast.LENGTH_SHORT).show();
                return true;
            case R.id.action_right_profile:
                Toast.makeText(this, "右侧头像按钮被点击", Toast.LENGTH_SHORT).show();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

Kotlin示例代码:

class MainActivity : AppCompatActivity() {
    private lateinit var drawerLayout: DrawerLayout
    private lateinit var drawerToggle: ActionBarDrawerToggle
    private lateinit var toolbar: Toolbar

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

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

        drawerLayout = findViewById(R.id.drawer_layout)
        drawerToggle = ActionBarDrawerToggle(
            this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close
        )
        drawerLayout.addDrawerListener(drawerToggle)
        drawerToggle.syncState()
    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.menu_main, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        if (drawerToggle.onOptionsItemSelected(item)) return true
        
        return when (item.itemId) {
            R.id.action_left_search -> {
                Toast.makeText(this, "左侧搜索按钮被点击", Toast.LENGTH_SHORT).show()
                true
            }
            R.id.action_left_filter -> {
                Toast.makeText(this, "左侧筛选按钮被点击", Toast.LENGTH_SHORT).show()
                true
            }
            R.id.action_right_settings -> {
                Toast.makeText(this, "右侧设置按钮被点击", Toast.LENGTH_SHORT).show()
                true
            }
            R.id.action_right_profile -> {
                Toast.makeText(this, "右侧头像按钮被点击", Toast.LENGTH_SHORT).show()
                true
            }
            else -> super.onOptionsItemSelected(item)
        }
    }
}

第三步:布局文件配置

确保你的布局里包含Toolbar和DrawerLayout,示例activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <!-- 主内容区 -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            android:elevation="4dp"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

        <!-- 这里放你的其他页面内容 -->
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="主内容区域"/>

    </LinearLayout>

    <!-- 侧边导航栏 -->
    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:menu="@menu/nav_menu"/>

</androidx.drawerlayout.widget.DrawerLayout>

核心逻辑说明

  • orderInCategory属性:这个属性控制菜单项的排列优先级,数值越小越靠左。Drawer Toggle是Toolbar的navigationIcon,占最左侧,所以小数值的菜单项会排在它右边,形成左侧菜单;大数值的则在Toolbar最右侧。
  • showAsAction="always":强制菜单项显示在Toolbar上,避免被放入溢出菜单。如果某些项你想在空间不足时才隐藏,可以改成ifRoom。

这样配置完成后,你的Toolbar就会呈现:最左侧是Drawer Toggle按钮,紧接着是你设置的左侧菜单项,右侧是另一组菜单项,完全满足你“两侧都保留、都显示”的需求。

内容的提问来源于stack exchange,提问作者ArghadipDasCEO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:56:57