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

Had*_*ari 3 back-button xamarin.android async-await xamarin.forms

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

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

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

    return true;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Had*_*ari 7

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

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

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

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

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

Xamarin 表单页面类

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Xamarin Android MainActivity 类

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());
    }
}
Run Code Online (Sandbox Code Playgroud)