Avi Patel
Avi Patel

Reputation: 485

Alert Dialog Button Pressed returning 0 values always

So, I want to detect button pressed by the user when an alert dialog pops up. This is my code.

public class AlertUtils {

    private int BTN_PRESSED;

    private AlertDialog.Builder builder;

    public AlertUtils(Context context){
        builder = new AlertDialog.Builder(context);
    }

    public int ShowAlertWithTwoButtons(String Title,String Message,String PositiveButtonText,
                                        String NegativeButtonText){
        builder.setTitle(Title);
        builder.setMessage(Message);

        builder.setPositiveButton(PositiveButtonText, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                BTN_PRESSED = i;
            }
        });

        builder.setNegativeButton(NegativeButtonText, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                BTN_PRESSED = i;
                dialogInterface.dismiss();
            }
        });

        builder.show();
        return BTN_PRESSED;
    }
}

By calling ShowAlertWithTwoButtons method, returns int value detecting Positive or Negative Button pressed. My Problem is it's giving me default 0 value when I chose from an alert dialog and when I again open us alert dialog it returns the correct value.

Upvotes: 0

Views: 144

Answers (2)

ישו אוהב אותך
ישו אוהב אותך

Reputation: 29783

You'll always get BTN_PRESSED with 0 value whenever you're instantiating your AlertUtils object and the calling the ShowAlertWithTwoButtons method. But you'll get another value if you're recalling the ShowAlertWithTwoButtons again.

I think what you're currently doing is like the following:

// First, you're instantiating the object
AlertUtils alertUtils = new AlertUtils(getContext());

// then you're calling the method
int pressedButton = alertUtils.ShowAlertWithTwoButtons("title", "message", "yes", "no");

// which will return pressedButton as 0

// then you calling the method again after clicked yes or no
int anotherPressedButton = alertUtils.ShowAlertWithTwoButtons("title", "message", "yes", "no");

// which will not zero. But can be -1, -2, -3 like in the
// https://developer.android.com/reference/android/content/DialogInterface.html

Which is incorrect if want to get the button value directly after the click because of asynchronous nature of AlertDialog interface.

Instead, you need to add a listener (ohh no, another listener) to your AlertUtils.


UPDATE

You need to add another listener for click button, something like this:

public class AlertUtils {

    public interface Listener {
      void onButtonClicked(int pressedButton);
    }

    private Listener mListener;

    private AlertDialog.Builder builder;

    public AlertUtils(Context context, Listener listener){
        builder = new AlertDialog.Builder(context);
        mListener = listener;
    }

    public void ShowAlertWithTwoButtons(String Title,String Message,String PositiveButtonText,
                                        String NegativeButtonText){
        ...

        builder.setPositiveButton(PositiveButtonText, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                mListener.onButtonClicked(i);
            }
        });

        builder.setNegativeButton(NegativeButtonText, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                mListener.onButtonClicked(i);
                dialogInterface.dismiss();
            }
        });

        builder.show();
    }
}

then you can create and call the method with:

// create the listener to listen for the clicked button.
AlertUtils.Listener listener = new AlertUtils.Listener() {
      @Override
      public void onButtonClicked(int pressedButton) {
        // here you'll receive the button value
        // do something here.
      }
   };

AlertUtils alertUtils = new AlertUtils(getContext(), listener);

// then you're calling the method
alertUtils.ShowAlertWithTwoButtons("title", "message", "yes", "no");

Upvotes: 1

Sandeep Insan
Sandeep Insan

Reputation: 348

Try in this way. Make AlertUtils class like this.

public class AlertUtils {
private AlertDialog.Builder builder;
private AlertDialogListener alertDialogListener;

// Interface to send back the response of click
interface AlertDialogListener {
    void onClick(int a);
}

public AlertUtils(Context context, AlertDialogListener alertDialogListener) {
    builder = new AlertDialog.Builder(context);
    this.alertDialogListener = alertDialogListener;
}

public void ShowAlertWithTwoButtons(String Title, String Message, String PositiveButtonText,
                                    String NegativeButtonText) {
    builder.setTitle(Title);
    builder.setMessage(Message);
    builder.setPositiveButton(PositiveButtonText, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            // if you want to pass the actual value of i,then pass the i in onClick or if you want 1 on 
            // positive button click then pass 1 here.
            alertDialogListener.onClick(1);
        }
    });
    builder.setNegativeButton(NegativeButtonText, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            // if you want to pass the actual value of i, then pass the i in onClick or if you want 1 on 
            // negative button click then pass 0 here.
            alertDialogListener.onClick(0);
            dialogInterface.dismiss();
        }
    });
    builder.show();
}

}

Call the dialog in this way where you need this.

  AlertUtils alertUtils = new AlertUtils(getContext(), new AlertUtils.AlertDialogListener() {
        @Override
        public void onClick(int a) {
            if (a == 1) {
                // Do your work on Positive button click
            } else {
                // Do your work on Negative button click
            }
        }
    });
    alertUtils.ShowAlertWithTwoButtons("Alert Dialog", "Alert Dialog Description ", "Positive", "Negative");

Upvotes: 2

Related Questions