按下后退按钮时如何提示退出?
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 项目中以这种方式调用此方法很容易:
- 在某处(例如页面)定义 public 静态 Action 字段
- 正在 MainActivity class 中通过 OnBackPressed
初始化此字段
所以整个解决方案是这样的:
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());
}
}
最近我不得不向 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 项目中以这种方式调用此方法很容易:
- 在某处(例如页面)定义 public 静态 Action 字段
- 正在 MainActivity class 中通过 OnBackPressed 初始化此字段
所以整个解决方案是这样的:
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());
}
}