Activity中Toolbar溢出菜单点击无响应问题求助
问题原因
你的菜单项使用了app:actionLayout="@layout/custom_menu_layout",这个属性会让系统用自定义布局渲染菜单项,此时默认的菜单项点击事件会被自定义布局拦截,导致onOptionsItemSelected方法无法触发。
解决方案
方案1:给自定义布局绑定点击监听
在onCreateOptionsMenu中获取菜单项的自定义布局,为其设置点击事件,同时结合Navigation跳转目标Fragment:
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); // 获取目标菜单项 MenuItem refineItem = menu.findItem(R.id.navigation_refine); // 获取自定义布局实例 View actionView = refineItem.getActionView(); if (actionView != null) { // 设置点击监听 actionView.setOnClickListener(v -> { // 获取NavController并跳转到目标Fragment NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_activity_main); navController.navigate(R.id.your_target_fragment_id); // 替换为你要打开的Fragment的id }); } return true; }
方案2:移除自定义布局(若无需自定义样式)
如果你的菜单项不需要自定义布局,直接删除app:actionLayout="@layout/custom_menu_layout",此时onOptionsItemSelected会正常触发,在方法内处理Navigation跳转:
@Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { if(item.getItemId() == R.id.navigation_refine){ // 获取NavController并跳转到目标Fragment NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_activity_main); navController.navigate(R.id.your_target_fragment_id); return true; // 返回true表示已处理该事件,无需父类继续处理 } return super.onOptionsItemSelected(item); }
额外检查项
- 确认
mobile_navigation.xml中已添加目标Fragment的节点,且可通过id正常跳转; - 确保
NavHostFragment的idR.id.nav_host_fragment_activity_main与布局文件中的配置完全一致。
内容的提问来源于stack exchange,提问作者Shivanshu Raj
相关产品推荐
相关产品推荐

