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

How to prompt for exit when back button is pressed?

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

我知道要检测 Xamarin Forms 中的后退按钮,我必须覆盖 Page.OnBackButtonPressed方法。为了绕过后退按钮,它应该 return true,像这样:

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

    return true;
}

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

我对任何ideas/suggestions如何改进持开放态度。

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

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

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

  1. 在某处(例如页面)定义 public 静态 Action 字段
  2. 正在 MainActivity class 中通过 OnBackPressed
  3. 初始化此字段

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

Xamarin 表单页面 Class

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());
    }
}