如何在按下后退按钮时提示退出?

时间:2018-03-02 20:16:07

标签: xamarin.forms xamarin.android

最近,我不得不在 Xamarin Forms 移动应用程序中添加一项功能。当用户按下后退按钮(在Android手机中)时,该功能会显示是/否提示。如果用户选择,它将丢弃该按钮,否则,它将应用隐藏应用程序的后退按钮。

我知道检测 Xamarin表单中的后退按钮我必须覆盖 Page.OnBackButtonPressed 方法。并且为了绕过后退按钮,它应该返回 true ,如下所示:

protected override bool OnBackButtonPressed()
{
    if (DisplayAlert("", "Are you sure?", "Yes", "No"))
        return false;

    return true;
}

但问题在于 Page.DisplayAlert 是异步方法,必须在主(UI)线程上调用。经过大量的搜索后,我想出了这个想要分享的想法。

我对如何改进的任何想法/建议持开放态度。

1 个答案:

答案 0 :(得分:3)

我认为在获得 DisplayAlert 的结果后,答案是模仿后退按钮。

为了模仿后退按钮,我发现调用 Activity.OnBackPressed 很有用。

当然,这不是最好的想法,但很容易以这种方式在Shared / PCL Xamarin Forms项目中调用此方法:

  1. 在某处定义公共静态操作字段(例如页面)
  2. 通过 OnBackPressed
  3. MainActivity 类中初始化此字段

    所以整个解决方案都是这样的:

    Xamarin表单页面类

    private class MyPage : ContentPage
    {
        public static Action EmulateBackPressed;
    
        private bool AcceptBack;
    
        protected override bool OnBackButtonPressed()
        {
            if (AcceptBack)
                return false;
    
            PromptForExit();
            return true;
        }
    
        private async void PromptForExit()
        {
            if (await DisplayAlert("", "Are you sure to exit?", "Yes", "No"))
            {
                AcceptBack = true;
                EmulateBackPressed();
            }
        }
    }
    

    Xamarin Android MainActivity Class

    public class MainActivity : Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            MyPage.EmulateBackPressed = OnBackPressed;
    
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;
    
            base.OnCreate(bundle);
    
            Xamarin.Forms.Forms.Init(this, bundle);
            LoadApplication(new App());
        }
    }