如何在Xamarin与MVVMCross中实现返回/向上导航?
解决Xamarin Android中ActionBar返回按钮OnOptionsItemSelected回调不触发的问题
最近在做Xamarin Android项目时踩了个坑,折腾了好半天才搞定,特意整理出来给遇到同样问题的朋友参考。
问题场景
我已经通过以下代码启用了ActionBar的返回按钮:
SupportActionBar.SetHomeButtonEnabled(true); SupportActionBar.SetDisplayHomeAsUpEnabled(true);
同时重写了OnOptionsItemSelected方法来处理返回逻辑:
public override bool OnOptionsItemSelected(IMenuItem item) { if (item.ItemId != global::Android.Resource.Id.Home) return base.OnOptionsItemSelected(item); ViewModel.BackNavigationButtonCommand.Execute(); return true; }
但点击返回按钮时,OnOptionsItemSelected的回调完全没触发,试了各种排查才找到原因。
常见原因及解决方案
1. 未正确关联自定义Toolbar到SupportActionBar
如果你的布局使用了自定义Toolbar,一定要在Activity的OnCreate方法中先将其设置为SupportActionBar,否则后续的返回按钮配置都是无效的:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.YourActivityLayout); // 关键步骤:关联自定义Toolbar var toolbar = FindViewById<Toolbar>(Resource.Id.toolbar); SetSupportActionBar(toolbar); // 再启用返回按钮 SupportActionBar.SetHomeButtonEnabled(true); SupportActionBar.SetDisplayHomeAsUpEnabled(true); }
2. Fragment拦截了菜单事件
如果当前Activity中加载了Fragment,且Fragment重写了OnOptionsItemSelected方法,一定要确保Fragment处理完自身菜单逻辑后,将事件传递给父Activity:
public override bool OnOptionsItemSelected(IMenuItem item) { // 处理Fragment专属的菜单逻辑(如果有) // ... // 必须返回base方法,让事件继续传递到Activity return base.OnOptionsItemSelected(item); }
如果Fragment直接返回true而不调用base方法,事件会被拦截,Activity的OnOptionsItemSelected就无法触发。
3. Activity主题未使用AppCompat系列
检查AndroidManifest.xml中当前Activity的主题,必须继承自Theme.AppCompat相关主题,否则SupportActionBar的API无法正常工作:
<activity android:name=".YourActivity" android:theme="@style/Theme.AppCompat.Light.DarkActionBar"> </activity>
使用非AppCompat主题会导致返回按钮的事件回调机制失效。
内容的提问来源于stack exchange,提问作者Orion
相关产品推荐
相关产品推荐

