听说是用removeDialog(id),但是我创建的时候不可以指定窗口的id啊, 而且该类也没有finish,dismiss,cancel等方法,麻烦了我的代码如下:
final View selectplate = inflater.inflate(R.layout.selectplateforchangecolor, null);
builder = new AlertDialog.Builder(STKActivity.this).setView(selectplate);
plateList = (ListView)selectplate.findViewById(R.id.plateList1);
builder.setTitle("选择板块");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {  
           public void onClick(DialogInterface dialog, int whichButton) {  
               //这里添加点击确定后的逻辑  
            logo = 1;
            cPage = 1;
            total = plateStockRelationService.CountStocksByPlateName(selectedPlateName);
            pageBean = new PageBean(cPage,total,pSize);
            freshStockList(pageBean);
           }  
       }).setNegativeButton("取消",null).create().show();
}

解决方案 »

  1.   

    补充下:在网上找了很久,应该是用removeDialog(id)方法,但是创建窗口的时候不能指定窗口的id啊,请问应该怎么设置id.
      

  2.   

    补充下:在网上找了很久,应该是用removeDialog(id)方法,但是创建窗口的时候不能指定窗口的id啊,请问应该怎么设置id.
      

  3.   

    你在代码逻辑中控制关闭dialog哇
      

  4.   

    id就是onClick方法的第二个参数~~
      

  5.   

    我发错代码了 汗死
    final View dialogView = inflater.inflate(
        R.layout.dialog_view, null);
    builder = new AlertDialog.Builder(STKActivity.this).setView(dialogView);
    builder.setTitle("更多操作");
    toPlateSet = (Button)dialogView.findViewById(R.id.toPlateSet);
    Button toStockGroup = (Button)dialogView.findViewById(R.id.toStockGroup);

    toPlateSet.setOnClickListener(new OnClickListener(){ @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    Intent toPlateSetIntent = new Intent();
    toPlateSetIntent.setClass(STKActivity.this, UserPlateSetActivity.class);
    startActivity(toPlateSetIntent);
    // 此处用removeDialog(id);id怎么设定?
    STKActivity.this.finish();
    }

    });

    toStockGroup.setOnClickListener(new OnClickListener(){ @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    Intent toPlateSetIntent = new Intent();
    toPlateSetIntent.setClass(STKActivity.this, PlateCombinationOpertion.class);
    startActivity(toPlateSetIntent);
    removeDialog(1);
    STKActivity.this.finish();
    }

    });


    builder.setNeutralButton("取消", null)
    .create();
    showDialog(1);
    builder.show(); 
    }
    这里onclick没有第二个参数。而且我也并不是在"确定","取消"中控制关闭的,因为我不希望点击逻辑按钮后再点击确定,这样用户体验不好。
      

  6.   

    给你一段简单的代码看看吧。public class STKActivity extends Activity
    {
    ……
    @Override
    protected Dialog onCreateDialog(int id) {
    // TODO Auto-generated method stub
    return new AlertDialog.Builder(STKActivity.this).(这儿自己添加).create();
    }
    ……
    }
    其实就是覆盖 Activity 的方法 onCreateDialog(int id),返回create()创建的Dialog 。
    在某个地方调用 onCreateDialog(),传入的id就是这个 AlertDialog.Builder对话框的id,所以要保存这个id值。然后在某个地方调用 removeDialog(id) 就关闭了这个对话框。
      

  7.   

    忘记一个东西,就是 调用 onCreateDialog()后,需要showDialog(id)
      

  8.   

    楼主是 dialog 上 再弹出dialog吗? build的时候能指定ID吧。
      

  9.   

    看了半天硬是没明白楼主是要关闭dialog呢,还是不要关闭dialog。你自己看吧:
    1.关闭dialog
    DialogInterface.OnClickListener接口的onClick方法第一个参数即为该接口的应用,调用dialog.dismiss()或cancel方法就可以关闭对话框。另外其实dialog的三个类型按钮只要点击就会关闭dialog。所以你想根据逻辑立即关闭dialog的话,只要在onClick方法内直接return就好。
    2.不关闭dialog
    因为dialog的三个类型按钮无论如何最终都会发送一个关闭消息儿导致对话框关闭。所以你如果要求手动控制(通过dismiss或cancel方法)来关闭对话框的话,你就需要用反射机制替换AlertDialog的消息处理函数。代码如下:/**
     *@title        ProcessDialog
     *@descript 处理dialog类
     *@author Finger
     *@date 2011-7-28
     *@version V1.0
     */
    public class ProcessDialog {
    public void processDialog(AlertDialog dialog){
    if(dialog == null)
    return;
     try  
            {            
                Field field  =  dialog.getClass().getDeclaredField("mAlert");
                field.setAccessible(true);
                //获得mAlert变量的值 
                Object obj  =  field.get(dialog);
                field  =  obj.getClass().getDeclaredField("mHandler");
                field.setAccessible(true);
                //修改mHandler变量的值,使用新的ButtonHandler类 
                field.set(obj, new ButtonHandler(dialog));
            }
             catch  (Exception e)
            {
            }
    }

    /***
     * 
     *@title        ButtonHandler
     *@descript dialog的Button消息处理类  *@author Finger
     *@date 2011-7-28
     *@version V1.0
     */
    class  ButtonHandler  extends  Handler
    {      private  WeakReference < DialogInterface >  mDialog;      public  ButtonHandler(DialogInterface dialog)
        {
            mDialog  =   new  WeakReference < DialogInterface > (dialog);
        }     @Override
         public   void  handleMessage(Message msg)
        {
             switch  (msg.what)
            {
                 case  DialogInterface.BUTTON_POSITIVE:
                 case  DialogInterface.BUTTON_NEGATIVE:
                 case  DialogInterface.BUTTON_NEUTRAL:
                    ((DialogInterface.OnClickListener) msg.obj).onClick(mDialog
                            .get(), msg.what);
                     break ;
            }
        }
    }
    }使用时,创建该类对象,调用processDialog传入要处理的AlertDialog即可。
      

  10.   

    还有另外一个方法,先建立一个Dialog对象和Handler对象class ..... extends Activity(){private Dialog mDialog;private Handler handler = new Handler(){@Override
    public void handleMessage(Message msg)
    {
       mDialog.dissmiss();
    }};public void onCreate(...)
    {
       AlertDialog.Builder builder = new AlertDialog.Builder(...);   .......   mDialog = builder.create();   mDialog.show();
    }
    //获取点击事件对象
    public OnClickListener getOnClickListener()
    {
       return new OnClickListener(){ 
         @Override
         public void onClick(View v) {
           // TODO Auto-generated method stub
           handler.sendEmptyMessage(0);//通过handler通知Dialog关闭
        }    }
    }
    }