深奥的dialog

  mDg = new Dialog(getActivity());
  mDg.setOnKeyListener(mVolPancelListener);
  
  Window win = mDg.getWindow();
  WindowManager.LayoutParams lp = win.getAttributes();
  win.setBackgroundDrawableResource(R.drawable.none);
  
  lp.x = 206;
  lp.y = -165;
  win.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
  mDg.setCanceledOnTouchOutside(true);


  mDg.requestWindowFeature(Window.FEATURE_NO_TITLE); 

  mDg.setContentView(mVolumeView);


说下Dialog的衍生AlertDialog,这个有个很讨厌的是点击相应钮,dialog就会消失,google了下解决办法,1,自绘view,然后放到dialog中,2,使用反射的方法,给alertdialog重置一个handler,代码如下

    /* 
     * define our own button handler, do not deal with dismiss message. 
     */ 
    class  ButtonHandler  extends  Handler { 

         private  WeakReference<DialogInterface> mDialog; //弱引用

         public ButtonHandler(DialogInterface dialog) { 
            mDialog = new WeakReference<DialogInterface>(dialog); 
         } 

         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 ; 
            } 
        } 
    } 
//展示dialog,其中参数dialog应该是new AlertDialog.Builder(mContext).create(),并且已经定义了view和响应事件的。

	  private void popUpDialog(AlertDialog dialog) { 
	        /* 
	         * alert dialog's default handler will always close dialog whenever user
	          * clicks on which button. we have to replace default handler with our 
	         * own handler for blocking close action. 
	         * Reflection helps a lot. 
	         */ 
	        try { 
	            Field field = dialog.getClass().getDeclaredField("mAlert"); 
	            field.setAccessible(true); 
	            
	            //retrieve mAlert value 
	            Object obj = field.get(dialog); 
	            field = obj.getClass().getDeclaredField("mHandler"); 
	            field.setAccessible(true); 
	            //replace mHandler with our own handler 
	            field.set(obj, bHandler); 
	        } catch (SecurityException e) { 
	        } catch (NoSuchFieldException e) { 
	        } catch (IllegalArgumentException e) { 
	        } catch (IllegalAccessException e) { 
	        } 
	        
	        //we can show this dialog now. 
	        dialog.show(); 
	    }



在dialog的dismiss的时候,如果它所在的context,比如说activity已经被finish了,会有java.lang.illegalargumentexception: view not attached to window manager异常。

在A中启动B,B中有线程操作,结束时涉及到对话框的dismiss。如果在操作尚未结束时,按下HOME键,线程后台操作。此时重新进去A,等到线程操作完成就会出现这个异常。此时应该做一个判断,如下:

                // Dismiss the Dialog only when the parent Activity is still alive.
                if (SelectContactsActivity!=null&&!SelectContactsActivity.this.isFinishing()) {
                    mProgressDialog.dismiss();
                }

你可能感兴趣的:(深奥的dialog)