如何在Drawer Toggle Button的左右两侧添加Options Menu?
嘿,这个需求其实不难实现,核心是利用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
相关产品推荐
相关产品推荐

