Android与设计模式之Builder

来源:互联网 发布:大数据架构师要求 编辑:程序博客网 时间:2024/06/11 10:17

AlertDialog与PopupWindow

Android有两种对话框,AlertDialog和PopupWindow。两者的主要区别是AlertDialog是非阻塞的,当AlertDialog弹出时,后台程序依然可以继续运行;而PopupWinodw是阻塞的,当PopupWindow弹出时,后台程序会一直等待,直到PopupWindow消失才继续运行。

以Builder方式创建PopupWindow

当我们创建AlertDialog时,我们只需要new AlertDialog.Builder().set…设置自己想要的属性即可。这是因为AlertDialog中有一个内部类Builder,他将我们设置的属性都赋值给AlertController(AlertDialog的具体实现类)。同样,我们也可以把PopupWindow的具体实现封装起来。这里为了方便起见,我们可以设置的属性只有标题,内容,和监听。

类图

源码

/** * Created by burypen on 2016/8/21. * <p/> * 用法类似于AlertDialog的PopupWindow */public class CommonPopupWindow extends PopupWindow {    public CommonPopupWindow(View contentView, int width, int height, boolean focusable) {        super(contentView, width, height, focusable);    }    public static class Builder {        private Context mContext;        /* 标题 */        private CharSequence mTitle;        /* 信息 */        private CharSequence mMsg;        /* 点击确认按钮的监听 */        private PositiveButtonClickListener positiveButtonClickListener;        /* 点击取消按钮的监听 */        private CancelButtonClickListener cancelButtonClickListener;        private CommonPopupWindow popupWindow;        public Builder(Context context) {            this.mContext = context;        }        public Builder setTitle(CharSequence title) {            if (title != null && !title.equals("")) {                mTitle = title;            }            return this;        }        public Builder setMessage(CharSequence msg) {            if (msg != null && !msg.equals("")) {                mMsg = msg;            }            return this;        }        public Builder setOnPositiveButtonClickListener(PositiveButtonClickListener listener) {            this.positiveButtonClickListener = listener;            return this;        }        public Builder setOnCancelButtonClickListener(CancelButtonClickListener listener) {            this.cancelButtonClickListener = listener;            return this;        }        public CommonPopupWindow create() {            View contentView = LayoutInflater.from(mContext).inflate(R.layout.common_popupwindow, null);            TextView tvTitle = (TextView) contentView.findViewById(R.id.tv_title);            TextView tvMessage = (TextView) contentView.findViewById(R.id.tv_message);            Button btPositive = (Button) contentView.findViewById(R.id.bt_positive);            Button btCancel = (Button) contentView.findViewById(R.id.bt_cancel);            if (mTitle != null && !mTitle.equals("")) {                tvTitle.setText(mTitle);                tvTitle.setVisibility(View.VISIBLE);            } else {                tvTitle.setVisibility(View.GONE);            }            if (mMsg != null && !mMsg.equals("")) {                tvMessage.setText(mMsg);                tvMessage.setVisibility(View.VISIBLE);            } else {                tvMessage.setVisibility(View.GONE);            }            btPositive.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    if (positiveButtonClickListener != null) {                        positiveButtonClickListener.onClick();                    }                    popupWindow.dismiss();                }            });            btCancel.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    if (cancelButtonClickListener != null) {                        cancelButtonClickListener.onClick();                    }                    popupWindow.dismiss();                }            });            popupWindow = new CommonPopupWindow(contentView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);            popupWindow.setBackgroundDrawable(new BitmapDrawable());            return popupWindow;        }        public CommonPopupWindow show(View parent, int gravity, int x, int y) {            CommonPopupWindow tmpPopupwindow = create();            tmpPopupwindow.showAtLocation(parent, gravity, x, y);            return tmpPopupwindow;        }    }    protected interface PositiveButtonClickListener {        public void onClick();    }    protected interface CancelButtonClickListener {        public void onClick();    }}

使用方法

new CommonPopupWindow.Builder(MyActivity.this)                        .setTitle("提示")                        .setMessage("popupwindow创建成功")                        .setOnPositiveButtonClickListener(new CommonPopupWindow.PositiveButtonClickListener() {                            @Override                            public void onClick() {                                Toast.makeText(MyActivity.this, "您点击了确定", Toast.LENGTH_SHORT).show();                            }                        })                        .setOnCancelButtonClickListener(new CommonPopupWindow.CancelButtonClickListener() {                            @Override                            public void onClick() {                                Toast.makeText(MyActivity.this, "您点击了取消", Toast.LENGTH_SHORT).show();                            }                        })                        .show(parentView, Gravity.CENTER, 0, 0);
0 0
原创粉丝点击