AlertDialog的一些实用技巧

         最近在开发一款手机短信、GPS、来电监听项目的时候,用到了弹出框(AlertDialog)的使用。

        在其中碰到过一个比较麻烦的情景:

                          弹出框需要密码校验,从输入框输入一个密码点击确认之后要对密码进行校验,如果密码错误则给出提示清空输入框,并且弹出框不退出。

                 这个需求并不复杂也不过分。但是AlertDialog无论单击哪个按钮都会关闭弹出框,所以无论用户是点击确定按钮还是取消按钮都要关闭对话框。这样需求就实现不了了。

              后面通过找资料跟查看源码(AlertController.java)发现系统是通过调用dismiss来关闭对话框,那么我们可以在dismiss方法上做点文章。在系统调用dismiss方法时会首先判断对话框是否已经关闭,如果对话框已经关闭了,就会退出dismiss方法而不再继续关闭对话框了。因此,我们可以欺骗一下系统,当调用dismiss方法时我们可以让系统以为对话框已经关闭(虽然对话框还没有关闭),这样dismiss方法就失效了,这样即使系统调用了dismiss方法也无法关闭对话框了。

           关键代码是:

              try
                {
                    Field field = dialog.getClass()
                            .getSuperclass().getDeclaredField(
                                     "mShowing" );
                    field.setAccessible( true );
                     //   将mShowing变量设为false,表示对话框已关闭
                    field.set(dialog, false );
                    dialog.dismiss();

                }
                catch (Exception e)
                {
                }

            案例代码如下:

        LayoutInflater factory = LayoutInflater.from(this);
        final View textEntryView = factory.inflate(R.layout.alert_dialog_text_entry, null);
        Builder bild =new AlertDialog.Builder(DialogTestActivity.this)
//                        .setIcon(R.drawable.alert_dialog_icon)    //设置弹出框中的提示图片
                        .setTitle(R.string.alert_dialog_text_entry)    //设置弹出框的标题内容
                        .setView(textEntryView)                                //设置弹出框显示的内容,在一个xml里面写了个输入框
                        .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            EditText pwd1 = (EditText)textEntryView.findViewById(R.id.name);  //获得文本框中的值
            String pwd2 = pwd1.getText().toString();                 //转换成String类型
            if(pwd2.equals("123456")){                                    //进行判断

                      //如果密码不同就不关闭弹出框

                 try
                {
                    Field field = dialog.getClass()
                            .getSuperclass().getDeclaredField(
                                     "mShowing" );
                    field.setAccessible( true );
                     //   将mShowing变量设为false,表示对话框已关闭
                    field.set(dialog, false );
                    dialog.dismiss();

                }
                catch (Exception e)
                {
                }
                pwd1.setText("");
                Toast.makeText(getApplicationContext(), "密码相同,弹出框不消失,清空数据!", 1).show();
                
            }else{
                try
                {
                    Field field = dialog.getClass()
                            .getSuperclass().getDeclaredField(
                                     "mShowing" );
                    field.setAccessible( true );
                     //   将mShowing变量设为false,表示对话框已关闭
                    field.set(dialog, true );
                    dialog.dismiss();

                }
                catch (Exception e)
                {
                }
                Toast.makeText(getApplicationContext(), "密码不同,弹出框消失!", 1).show();
            }           
                            }
                        })
                        .setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            try
            {
                Field field = dialog.getClass()
                        .getSuperclass().getDeclaredField(
                                 "mShowing" );
                field.setAccessible( true );
                 //   将mShowing变量设为false,表示对话框已关闭
                field.set(dialog, true );
                dialog.dismiss();

            }
            catch (Exception e)
            {
            }
                            }
                        });
        bild.create();
        bild.show();


你可能感兴趣的:(AlertDialog的一些实用技巧)