Xamarin Forms AppCompat OnOptionsItemSelected

XamarinForms AppCompat OnOptionsItemSelected

我最近将 xamarin forms 更新到 1.5.1-pre1 以便我可以使用漂亮的 AppCompat 主题。它很好用,看起来也很不错。

我确实有一个问题,在我的旧 FormsApplicationActivity 中,我曾经覆盖 OnOptionsItemSelected 方法以在用户单击后退箭头图标时进行拦截并进行一些视图模型清理。显然,在使用 FormsAppCompatActivity 后不会调用此方法。 如何拦截 "soft" 后退按钮按下(工具栏图标不是硬后退按钮)?

我也尝试覆盖 Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer 但我似乎无法覆盖它 :(

有谁知道我如何拦截它?

您可以将以下内容添加到您的自定义渲染器中。您可以使用 current activity plugin 或将您的上下文转换为 activity。

var toolbar = CrossCurrentActivity.Current?.Activity?.FindViewById<Toolbar>(Resource.Id.toolbar);

toolbar.NavigationClick += ToolbarNavigationClick;

查看 OnCreate() 的最后两行 添加它们后 OnOptionsItemSelected 被按预期调用)。

https://raw.githubusercontent.com/UdaraAlwis/Xamarin-Playground/master/XFNavBarBackBtnClickOverride/XFNavBarBackBtnClickOverride/XFNavBarBackBtnClickOverride.Droid/MainActivity.cs

        Toolbar toolbar = this.FindViewById<Toolbar>(Resource.Id.toolbar);

        SetSupportActionBar(toolbar);

在 Xamarin.Forms 中有一个更好的方法来拦截按下 NavigationBar 后退按钮和按下硬件后退按钮,这是创建您自己的 NavigationRenderer 并覆盖方法 OnPopViewAsync:

[assembly: ExportRenderer(typeof(NavigationPage), typeof(CustomNavigationRenderer))]
namespace YourApp.Droid
{
    public class CustomNavigationRenderer : NavigationPageRenderer
    {
        public CustomNavigationRenderer(Context context) : base(context)
        {
        }

        protected override async Task<bool> OnPopViewAsync(Page page, bool animated)
        {
            // Write your code here
        }
    }
}

希望对您有所帮助