package com.iwhys.cnode.widget; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.view.Gravity; import android.view.KeyEvent; import android.view.View; import android.view.Window; import android.view.WindowManager; import com.iwhys.cnode.R; /** * 作者:魔鬼 * E-mail:iwhs@qq.com * 创建时间:2013年11月25日 上午9:25:20 * 类说明:对话框基类,去除默认样式,必须自定义布局 * * 修订时间:2014年08月14日 上午 * 修订说明:显示之前对话框只重设宽高尺寸,位置、动画只在初始化设置一次,暴露是否可以取消、是否可以通过按返回键强制取消接口 * */ public abstract class BaseDialog extends Dialog implements DialogInterface.OnDismissListener{ protected Context mContext; protected View mView; private Window mWindow; //是否允许强制退出 private boolean cancelForce = true; /** * @param context 上下文 * @param resourceId 布局资源文件id */ public BaseDialog(Context context, int resourceId) { super(context, R.style.MyDialog); mContext = context; mView = View.inflate(mContext, resourceId, null); mWindow = getWindow(); init(); } public void setCancelForce(boolean cancelForce){ this.cancelForce = cancelForce; } /** * 设置外观并显示 */ @Override public void show() { setDialogSize(); //显示之前刷新view,防止view变形 mView.post(new Runnable() { @Override public void run() { mView.postInvalidate(); } }); super.show(); } @Override public void hide() { if (isShowing()){ this.dismiss(); } } /** * 对话框消失之前执行 */ @Override public void onDismiss(DialogInterface dialog) { } /** * 是否允许取消 * @return */ protected boolean dialogCancelable(){ return true; } /** * 是否允许点击dialog范围之外取消 * @return */ protected boolean dialogCanceledOnTouchOutside(){ return true; } /** * 子类需要修改动画,直接覆写该方法 */ protected int dialogAnimation() { return android.R.style.Animation_Dialog; } /** * 子类需要修改位置,直接覆写该方法 * 默认屏幕底部 */ protected int dialogGravity(){ return Gravity.CENTER; } /** * 设置窗口布局宽度,默认适应填充数据之后的View * @return */ protected int dialogWidth(){ mView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); return mView.getMeasuredWidth(); } /** * 设置dialog高度 */ protected int dialogHeight() { mView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); return mView.getMeasuredHeight(); } //初始化设置 private void init(){ setContentView(mView); setCanceledOnTouchOutside(dialogCanceledOnTouchOutside()); setCancelable(dialogCancelable()); setOnDismissListener(this); mWindow.setWindowAnimations(dialogAnimation()); mWindow.setGravity(dialogGravity()); } //设置对话框宽、高属性 private void setDialogSize() { WindowManager.LayoutParams wlp = mWindow.getAttributes(); wlp.width = dialogWidth(); wlp.height = dialogHeight(); mWindow.setAttributes(wlp); } /** * 获取字符串 * @param resId * @return */ protected String getString(int resId) { return mContext.getResources().getString(resId); } /* * 拦截返回键,触发时调用hide方法隐藏dialog */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() != KeyEvent.ACTION_UP) { //event.getAction()!=KeyEvent.ACTION_UP 不响应抬起动作,可防止执行两次 if (cancelForce){ hide(); } return true; } return super.onKeyDown(keyCode, event); } }