MaterialSearchView与Navigation Drawer共存时菜单XML双层结构合理性咨询
嘿,完全不用担心,你这种采用双层结构编写菜单XML的做法完全合规,甚至是处理这类场景的推荐方式哦!
为什么这种做法没问题?
Navigation Drawer的菜单和MaterialSearchView对应的Toolbar菜单本来就承担着不同的职责:
- 导航抽屉的菜单是用来管理侧边栏的全局导航选项,比如你代码里的「SellMyPaper」「SendPaper」这类入口;
- MaterialSearchView需要的是顶部操作栏里的搜索触发项,属于页面的功能操作。
把它们分开编写(或者在同一文件里用group区分),不仅符合Android的菜单设计规范,还能让代码结构更清晰,后期维护起来也更省心。
给你整理下标准的实现示例
1. 导航抽屉专属菜单(res/menu/drawer_menu.xml)
这部分就是你已经在写的侧边栏选项:
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <item android:id="@+id/nav_SellPaper" android:icon="@drawable/ic_seller" android:title="@string/SellMyPaper" /> <item android:id="@+id/nav_sendPaper" android:icon="@drawable/ic_send" android:title="@string/SendPaper" /> <!-- 其他导航菜单项继续在这里添加 --> </group> </menu>
2. 顶部Toolbar+搜索菜单(res/menu/toolbar_menu.xml)
专门用来承载MaterialSearchView的触发按钮:
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_search" android:icon="@drawable/ic_search" android:title="@string/search" app:actionViewClass="com.miguelcatalan.materialsearchview.MaterialSearchView" app:showAsAction="always" /> </menu>
3. Activity中的初始化代码
在你的Activity里分别加载这两个菜单,并初始化搜索视图:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化Navigation Drawer NavigationView navigationView = findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); navigationView.inflateMenu(R.menu.drawer_menu); // 初始化Toolbar和搜索视图 Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); MaterialSearchView searchView = findViewById(R.id.action_search); // 设置搜索相关的监听逻辑 searchView.setOnQueryTextListener(new MaterialSearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { // 处理搜索提交逻辑 return true; } @Override public boolean onQueryTextChange(String newText) { // 处理搜索文本实时变化逻辑 return true; } }); } // 加载Toolbar菜单 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.toolbar_menu, menu); return true; }
额外小提示
如果你之前是把两个菜单的内容写在同一个XML文件里,用group标签分隔开,这种方式也是可行的,但分开成两个独立的菜单文件会让职责划分更明确,代码可读性更高哦~
内容的提问来源于stack exchange,提问作者HajAli
相关产品推荐
相关产品推荐

