【问题标题】:Navbar back button override导航栏后退按钮覆盖
【发布时间】:2018-01-03 09:19:28
【问题描述】:

我需要覆盖后退按钮。有 OnBackButtonPressed() 方法,但在 android 中仅适用于硬件按钮!如何覆盖软件导航栏按钮? 我正在使用同一个页面,我需要回到该页面的先前状态(页面视图因 json 文件更改而更改)

【问题讨论】:

    标签: c# button xamarin xamarin.forms xamarin.android


    【解决方案1】:

    您应该查看有关此问题的 Xamarin 帮助页面,因为它列出了修复您的设计以反对以这种方式实现某些东西的许多原因(例如使用 PushModalAsync 而不是 PushAsync 显示 NavigationPage)。

    Xamarin Help Link

    我还将发布一个链接,指向我在一个类似问题上的另一个答案,该问题讨论了在用户单击后退按钮后处理保存页面信息的另一种方法(如果他们选择这样做)。

    Link

    但来自 Xamarin 帮助网站的答案的 Android 要点是在您的 MainActivity 中覆盖 OnOptionsItemSelected(如果您没有在导航中使用 MasterDetailPage,则需要修改下面的 var navPage... 代码):

    public override bool OnOptionsItemSelected(IMenuItem item)
    {
        var app = Application.Current;
        if (item.ItemId == 16908332) // This makes me feel dirty.
        {
            var navPage = ((app.MainPage.Navigation.ModalStack[0] as MasterDetailPage).Detail as NavigationPage);
    
            if (app != null && navPage.Navigation.NavigationStack.Count > 0)
            {
                int index = navPage.Navigation.NavigationStack.Count - 1;
    
                var currentPage = navPage.Navigation.NavigationStack[index];
    
                var vm = currentPage.BindingContext as ViewModel;
    
                if (vm != null)
                {
                    var answer = vm.OnBackButtonPressed();
                    if (answer)
                        return true;
                }
    
            }
        }
    
        return base.OnOptionsItemSelected(item);
    }
    

    【讨论】: