简体   繁体   中英

Custom AlertDialog.Builder class in android won't show

I'm currently writing a program that will use the Geocoder to search for possible GeoPoints of a city search. I then take the geopoints and add it to a map as overlays, the user can then click the overlay, and an alert dialog will pop up to ask if he/she is sure that this is the right one.

I couldn't figure out a way to get the alert dialog to work like swing where after the user clicks yes or no, I can retrieve the answer. So I extended the AlertDialog.Builder class like so, which also happens to be a Dialog.OnClicklistener

public class MyAlertDialog extends AlertDialog.Builder implements DialogInterface.OnClickListener{ 
final static int positiveMessage = 1;
final static int negativeMessage = 0; 
final static int neutralMessage = -1;

private int myMessage; 

public MyAlertDialog(Context activity) {
    super(activity);
}

@Override
public void onClick(DialogInterface dialog, int which) {
    if(which == dialog.BUTTON_POSITIVE){
        myMessage = positiveMessage;
    }
    else if(which == dialog.BUTTON_NEGATIVE){
        myMessage = negativeMessage;
    }
    else{
        myMessage = neutralMessage;
    }
}

public int getMessage() {
    return myMessage;
}

and I implement it like so

    protected boolean onTap(int index) {

    OverlayItem item = overlays.get(index);
      MyAlertDialog dialog = new MyAlertDialog(ctx);
      dialog.setTitle(item.getTitle());
      dialog.setMessage("Is this the " + item.getTitle()
              + " you're looking for?");
      dialog.setPositiveButton("Yes",null);
      dialog.setNegativeButton("Cancel", null);
      dialog.show();

      if(dialog.getMessage()== MyAlertDialog.positiveMessage){
               //do some stuff

But for some reason the dialog wont show until after the method has returned, so it never does the stuff. Anyone have any ideas? Oh and ctx is a reference to my mapActivity

This is because the dialog.show(); method does not wait for the user to interact with the Dialog before returning. It does exactly what the name would suggest, and nothing more; it shows the Dialog, and then returns. So, that means that your myMessage field will always be null and this condition will never be true:

      if(dialog.getMessage()== MyAlertDialog.positiveMessage){

What you should do instead is pass in OnClickListener for both your positive and negative button, and do whatever you need to in the respective OnClickListener. You won't even need to make a subclass of AlertDialog.Builder, because there won't be any benefit to doing that. Here's how that looks:

dialog.setPositiveButton("Yes", new DialogInterface.OnClickListener(){
    @Override
    public void onClick(DialogInterface dialog, int which){
        // Do some positive stuff here!
    }
});
dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
    @Override
    public void onClick(DialogInterface dialog, int which){
        // Do some negative stuff here!
    }
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM