android中的自定义AlertDialog.Builder类不会显示

时间:2012-12-11 00:20:17

标签: java android sqlite google-maps

我目前正在编写一个程序,该程序将使用Geocoder搜索城市搜索的可能GeoPoints。然后我获取地理位置并将其作为叠加层添加到地图中,然后用户可以单击叠加层,然后会弹出一个警告对话框,询问他/她是否确定这是正确的。

我无法找到让警报对话框像swing一样工作的方法,在用户单击是或否之后,我可以检索答案。所以我像这样扩展了AlertDialog.Builder类,它也恰好是一个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;
}

我实现它就像这样

    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

但由于某种原因,对话框在方法返回之后才会显示,因此它永远不会完成。有人有主意吗?哦,ctx是对mapActivity的引用

1 个答案:

答案 0 :(得分:0)

这是因为dialog.show();方法不会等待用户在返回之前与Dialog交互。它完全符合名称所暗示的内容,仅此而已;它显示对话框,然后返回。因此,这意味着您的myMessage字段将始终为null,并且此条件永远不会成立:

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

您应该做的是传递OnClickListener以获取正面和负面按钮,并在相应的OnClickListener中执行您需要的任何操作。您甚至不需要创建AlertDialog.Builder的子类,因为这样做没有任何好处。这是看起来的样子:

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!
    }
});