18
votes

I am stuck at one point in Xamarin.Forms application

On Back button press simply I want to ask user to confirm whether he really wants to exit or not, "OnBackButtonPressed" I want to show Alert dialog and proceed as user response.

But "OnBackButtonPressed" is not Async I cannot write await DisplayAlert... Please direct me how should i implement this feature?

I am using ContentPage as my root Page of NavigationPage

    public class frmHome : ContentPage

Here is the code :

protected override bool OnBackButtonPressed()
{
    var result = await  this.DisplayAlert("Alert!", "Do you really want to exit?", "Yes", "No");

    if (result)
        {
            //user wants to exit
            //Terminate application
        }
        else
        {
            //Dont do anything
        }
}
7

7 Answers

41
votes
    protected override bool OnBackButtonPressed()
    {
        Device.BeginInvokeOnMainThread(async() => {
            var result = await this.DisplayAlert("Alert!", "Do you really want to exit?", "Yes", "No");
            if (result) await this.Navigation.PopAsync(); // or anything else
        });

        return true;
    }
3
votes

Here's the code that worked for me

protected override bool OnBackButtonPressed()
    {
        Device.BeginInvokeOnMainThread(async () =>
        {
            var result = await this.DisplayAlert("Alert!", "Do you really want to exit?", "Yes", "No");

            if (result)
            {
                System.Diagnostics.Process.GetCurrentProcess().CloseMainWindow(); // Or anything else
            }
        });
        return true;
    }
2
votes

If you are on Mainpage and want to exit your app then this code will help you.

In your UI (PCL)

  protected override bool OnBackButtonPressed()
            {

                Device.BeginInvokeOnMainThread(new Action(async () => {
                    var result = await this.DisplayAlert("Alert!", "Do you really want to exit?", "Yes", "No");

                    if (result)
                    {
                        if (Device.RuntimePlatform == Device.Android)
                            DependencyService.Get<IAndroidMethods>().CloseApp();
                    }
                }));
                return true;
            }

Also create an Interface (in your UI PCL):

public interface IAndroidMethods
{
    void CloseApp();
}

Now implement the Android-specific logic in your Android project:

[assembly: Xamarin.Forms.Dependency(typeof(AndroidMethods))]
namespace Your.Namespace
{
   public class AndroidMethods : IAndroidMethods
   {
       public void CloseApp()
       {
             var activity = (Activity)Forms.Context;
            activity.FinishAffinity();
       }
   }
}
1
votes

Easy way to override hardware back button and show a confirmation dialog box to user

protected override bool OnBackButtonPressed()
{
    Device.BeginInvokeOnMainThread(async () =>
    {
        if (await DisplayAlert("Alert", "Are you sure you want to go back ?", "Yes", "No"))
        {
            base.OnBackButtonPressed();

            await Navigation.PopAsync();
         }
    });

    return true;
}
1
votes
public override void OnBackPressed()
{
    RunOnUiThread(
        async () =>
        {
            var isCloseApp = await AlertAsync(this, "NameOfApp", "Do you want to close this app?", "Yes", "No");

            if (isCloseApp)
            {
                var activity = (Activity)Forms.Context;
                activity.FinishAffinity();
            }
        });
}

public Task<bool> AlertAsync(Context context, string title, string message, string positiveButton, string negativeButton)
{
    var tcs = new TaskCompletionSource<bool>();

    using (var db = new AlertDialog.Builder(context))
    {
        db.SetTitle(title);
        db.SetMessage(message);
        db.SetPositiveButton(positiveButton, (sender, args) => { tcs.TrySetResult(true); });
        db.SetNegativeButton(negativeButton, (sender, args) => { tcs.TrySetResult(false); });
        db.Show();
    }

    return tcs.Task;
}

Xamarin.Android await AlertDialog.Builder

0
votes
 private async void OnDelete(object sender, EventArgs e)
        {
            var result = await this.DisplayAlert("Alert!", "Do you really want to exit?", "Yes", "No");
            if (result)
            {

                var menuitem = sender as MenuItem;
                string name = menuitem.BindingContext as string;

                lielements.Remove(name);
            }
            else
            {


            }

        }
0
votes

I am done like this

protected override bool OnBackButtonPressed()
{
    var result = await  this.DisplayAlert("Alert!", "Do you really want to exit?", "Yes", "No");

    if (result)
        {
            Process.GetCurrentProcess().CloseMainWindow();
            Process.GetCurrentProcess().Close();
        }
        else
        {
            //Dont do anything
        }
}