Xamarin C# - Android - Prevent an AlertDialog from closing on PositiveButton click
android, c#, java, xamarin, xamarin.android
Solution
This requires to think a bit outside the box. You will have to manipulate the `AlertDialog` object directly:
// Build the dialog.
var builder = new AlertDialog.Builder(this);
builder.SetTitle("Click me!");
// Create empty event handlers, we will override them manually instead of letting the builder handling the clicks.
builder.SetPositiveButton("Yes", (EventHandler<DialogClickEventArgs>)null);
builder.SetNegativeButton("No", (EventHandler<DialogClickEventArgs>)null);
var dialog = builder.Create();
// Show the dialog. This is important to do before accessing the buttons.
dialog.Show();
// Get the buttons.
var yesBtn = dialog.GetButton((int)DialogButtonType.Positive);
var noBtn = dialog.GetButton((int)DialogButtonType.Negative);
// Assign our handlers.
yesBtn.Click += (sender, args) =>
{
// Don't dismiss dialog.
Console.WriteLine("I am here to stay!");
};
noBtn.Click += (sender, args) =>
{
// Dismiss dialog.
Console.WriteLine("I will dismiss now!");
dialog.Dismiss();
};
Problem
I'm new to Xamarin and I don't know how to do the following in c#. I want to prevent an alertdialog from closing when clicking on the Positive/Negative buttons. I need to do some validation on the input first. If the input is correct, the dialog can close, else I will show a message with instructions. Basically, I have the following code: ``` private void CreateAddProjectDialog() { //some code var alert = new AlertDialog.Builder (this); alert.SetTitle ("Create new project"); alert.SetView (layoutProperties); alert.SetCancelable (false); alert.SetPositiveButton("Create", HandlePositiveButtonClick); alert.SetNegativeButton("Cancel", HandelNegativeButtonClick); } private void HandlePositiveButtonClick (object sender, EventArgs e) { //Do some validation here and return false (prevent closing of dialog) if invalid, else close.... } ``` Now, I red the following post on StackOverflow: How to prevent a dialog from closing when a button is clicked I think the code below (taken from the thread) has the solution, but I don't know how to rewrite my c# code to implement the Java: ``` AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setMessage("Test for preventing dialog close"); builder.setPositiveButton("Test", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //Do nothing here because we override this button later to change the close behaviour. //However, we still need this because on older versions of Android unless we //pass a handler the button doesn't get instantiated } }); AlertDialog dialog = builder.create(); dialog.show(); //Overriding the handler immediately after show is probably a better approach than OnShowListener as described below dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Boolean wantToCloseDialog = false; //Do stuff, possibly set wantToCloseDialog to true then... if(wantToCloseDialog) dismiss(); //else dialog stays open. Make sure you have an obvious way to close the dialog especially if you set cancellable to false. } }); ``` How to code this in c#? Especially the override part in the setPositiveButton area...