android ModalDialog

来源:互联网 发布:淘宝模特一分钟摆姿势 编辑:程序博客网 时间:2024/06/07 02:28
public class ModalDialog {private boolean mChoice = false;        private boolean mQuitModal = false;     private Method mMsgQueueNextMethod = null;private Field mMsgTargetFiled = null;public ModalDialog() {}public void showAlertDialog(Context context, String info) {    if (!prepareModal()) {        return;    }    // build alert dialog    AlertDialog.Builder builder = new AlertDialog.Builder(context);    builder.setMessage(info);    builder.setCancelable(false);    builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {        public void onClick(DialogInterface dialog, int id) {            ModalDialog.this.mQuitModal = true;            dialog.dismiss();        }    });    AlertDialog alert = builder.create();    alert.show();    // run in modal mode    doModal();}public boolean showConfirmDialog(Context context, String info) {    if (!prepareModal()) {        return false;    }    // reset choice    mChoice = false;    AlertDialog.Builder builder = new AlertDialog.Builder(context);    builder.setMessage(info);    builder.setCancelable(false);    builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {        public void onClick(DialogInterface dialog, int id) {            ModalDialog.this.mQuitModal = true;            ModalDialog.this.mChoice = true;            dialog.dismiss();        }    });    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {        public void onClick(DialogInterface dialog, int id) {            ModalDialog.this.mQuitModal = true;            ModalDialog.this.mChoice = false;            dialog.cancel();        }    });    AlertDialog alert = builder.create();    alert.show();    doModal();    return mChoice;}private boolean prepareModal() {    Class<?> clsMsgQueue = null;    Class<?> clsMessage = null;    try {        clsMsgQueue = Class.forName("android.os.MessageQueue");    } catch (ClassNotFoundException e) {        e.printStackTrace();        return false;    }    try {        clsMessage = Class.forName("android.os.Message");    } catch (ClassNotFoundException e) {        e.printStackTrace();        return false;    }    try {        mMsgQueueNextMethod = clsMsgQueue.getDeclaredMethod("next", new Class[]{});    } catch (SecurityException e) {        e.printStackTrace();        return false;    } catch (NoSuchMethodException e) {        e.printStackTrace();        return false;    }    mMsgQueueNextMethod.setAccessible(true);    try {        mMsgTargetFiled = clsMessage.getDeclaredField("target");    } catch (SecurityException e) {        e.printStackTrace();        return false;    } catch (NoSuchFieldException e) {        e.printStackTrace();        return false;    }    mMsgTargetFiled.setAccessible(true);    return true;}private void doModal() {    mQuitModal = false;    // get message queue associated with main UI thread    MessageQueue queue = Looper.myQueue();    while (!mQuitModal) {        // call queue.next(), might block        Message msg = null;        try {            msg = (Message)mMsgQueueNextMethod.invoke(queue, new Object[]{});        } catch (IllegalArgumentException e) {            e.printStackTrace();        } catch (IllegalAccessException e) {            e.printStackTrace();        } catch (InvocationTargetException e) {            e.printStackTrace();        }        if (null != msg) {            Handler target = null;            try {                target = (Handler)mMsgTargetFiled.get(msg);            } catch (IllegalArgumentException e) {                e.printStackTrace();            } catch (IllegalAccessException e) {                e.printStackTrace();            }            if (target == null) {                // No target is a magic identifier for the quit message.                mQuitModal = true;            }            target.dispatchMessage(msg);            msg.recycle();        }    }}}

原创粉丝点击