项目迁移至AndroidX后无法重写onMenuItemSelected方法的解决咨询
这个问题我之前迁移项目时也踩过坑,确实从support library 27以及对应的AndroidX AppCompat库开始,androidx.appcompat.app.AppCompatActivity里的onMenuItemSelected()被标记为final,没办法再通过重写它来处理菜单点击了。不过官方已经提供了明确的替代方案,主要有两种方式:
1. 重写onOptionsItemSelected()方法
这是官方推荐的标准替代方式,也是现在处理菜单点击事件的主流做法。你只需要在你的Activity里重写这个方法,通过判断菜单item的ID来处理对应的点击逻辑:
@Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case R.id.menu_item_settings: // 处理设置菜单的点击逻辑 return true; case R.id.menu_item_share: // 处理分享菜单的点击逻辑 return true; default: return super.onOptionsItemSelected(item); } }
返回true表示你已经处理了该点击事件,返回false则会让事件继续向上传递。
2. 给单个MenuItem设置点击监听器
如果你只需要给某个特定的菜单item单独设置点击逻辑,也可以在onCreateOptionsMenu()方法中拿到对应的MenuItem实例,直接调用setOnMenuItemClickListener():
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_menu, menu); // 获取指定的MenuItem并设置点击监听器 MenuItem settingsItem = menu.findItem(R.id.menu_item_settings); settingsItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { // 处理设置菜单的点击逻辑 return true; } }); return true; }
这种方式适合需要给不同菜单item设置独立逻辑,或者不想在onOptionsItemSelected()里写大量switch-case的场景。
补充说明
官方做出这个变更的原因是为了统一菜单事件的处理流程,让onOptionsItemSelected()成为处理菜单点击的唯一入口,避免之前多种方法并存导致的逻辑混乱。所以建议优先使用第一种方式,保持代码的规范性。
内容的提问来源于stack exchange,提问作者Sirelon
相关产品推荐
相关产品推荐

