package com.diandi.demo.widget.dialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.view.View; import android.view.View.OnFocusChangeListener; import android.view.WindowManager; import android.view.WindowManager.LayoutParams; import android.widget.Button; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.TextView; import com.diandi.demo.R; /** * ******************************************************************************* * ********* Author : klob(kloblic@gmail.com) . * ********* Date : 2014-11-29 . * ********* Time : 11:46 . * ********* Project name : Diandi1.18 . * ********* Version : 1.0 * ********* Copyright @ 2014, klob, All Rights Reserved * ******************************************************************************* */ public abstract class DialogBase extends Dialog { private final int MATCH_PARENT = android.view.ViewGroup.LayoutParams.MATCH_PARENT; protected OnClickListener onSuccessListener; protected Context mainContext; protected OnClickListener onCancelListener;//提供给取消按钮 protected OnDismissListener onDismissListener; protected View view; protected Button positiveButton, negativeButton; private boolean isFullScreen = false; private boolean hasTitle = true;//是否有title private int width = 0, height = 0, x = 0, y = 0; private int iconTitle = 0; private String message, title; private String namePositiveButton, nameNegativeButton; private boolean isCancel = true;//默认是否可点击back按键/点击外部区域取消对话框 /** * 构造函数 * * @param context 对象应该是Activity */ public DialogBase(Context context) { super(context, R.style.alert); this.mainContext = context; } public boolean isCancel() { return isCancel; } public void setCancel(boolean isCancel) { this.isCancel = isCancel; } /** * 创建事件 */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.v2_dialog_base); this.onBuilding(); // 设置标题和消息 LinearLayout dialog_top = (LinearLayout) findViewById(R.id.dialog_top); View title_red_line = (View) findViewById(R.id.title_red_line); //是否有title if (hasTitle) { dialog_top.setVisibility(View.VISIBLE); title_red_line.setVisibility(View.VISIBLE); } else { dialog_top.setVisibility(View.GONE); title_red_line.setVisibility(View.GONE); } TextView titleTextView = (TextView) findViewById(R.id.dialog_title); titleTextView.setText(this.getTitle()); TextView messageTextView = (TextView) findViewById(R.id.dialog_message); messageTextView.setText(this.getMessage()); if (view != null) { FrameLayout custom = (FrameLayout) findViewById(R.id.dialog_custom); custom.addView(view, new LayoutParams(MATCH_PARENT, MATCH_PARENT)); findViewById(R.id.dialog_contentPanel).setVisibility(View.GONE); } else { findViewById(R.id.dialog_customPanel).setVisibility(View.GONE); } // 设置按钮事件监听 positiveButton = (Button) findViewById(R.id.dialog_positivebutton); negativeButton = (Button) findViewById(R.id.dialog_negativebutton); if (namePositiveButton != null && namePositiveButton.length() > 0) { positiveButton.setText(namePositiveButton); positiveButton.setOnClickListener(GetPositiveButtonOnClickListener()); } else { positiveButton.setVisibility(View.GONE); findViewById(R.id.dialog_leftspacer).setVisibility(View.VISIBLE); findViewById(R.id.dialog_rightspacer).setVisibility(View.VISIBLE); } if (nameNegativeButton != null && nameNegativeButton.length() > 0) { negativeButton.setText(nameNegativeButton); negativeButton.setOnClickListener(GetNegativeButtonOnClickListener()); } else { negativeButton.setVisibility(View.GONE); } // 设置对话框的位置和大小 LayoutParams params = this.getWindow().getAttributes(); if (this.getWidth() > 0) params.width = this.getWidth(); if (this.getHeight() > 0) params.height = this.getHeight(); if (this.getX() > 0) params.width = this.getX(); if (this.getY() > 0) params.height = this.getY(); // 如果设置为全屏 if (isFullScreen) { params.width = WindowManager.LayoutParams.MATCH_PARENT; params.height = WindowManager.LayoutParams.MATCH_PARENT; } //设置点击dialog外部区域可取消 if (isCancel) { setCanceledOnTouchOutside(true); setCancelable(true); } else { setCanceledOnTouchOutside(false); setCancelable(false); } getWindow().setAttributes(params); this.setOnDismissListener(GetOnDismissListener()); this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); } /** * 获取OnDismiss事件监听,释放资源 * * @return OnDismiss事件监听 */ protected OnDismissListener GetOnDismissListener() { return new OnDismissListener() { public void onDismiss(DialogInterface arg0) { DialogBase.this.onDismiss(); DialogBase.this.setOnDismissListener(null); view = null; mainContext = null; positiveButton = null; negativeButton = null; if (onDismissListener != null) { onDismissListener.onDismiss(null); } } }; } /** * 获取确认按钮单击事件监听 * * @return 确认按钮单击事件监听 */ protected View.OnClickListener GetPositiveButtonOnClickListener() { return new View.OnClickListener() { public void onClick(View v) { if (OnClickPositiveButton()) DialogBase.this.dismiss(); } }; } /** * 获取取消按钮单击事件监听 * * @return 取消按钮单击事件监听 */ protected View.OnClickListener GetNegativeButtonOnClickListener() { return new View.OnClickListener() { public void onClick(View v) { OnClickNegativeButton(); DialogBase.this.dismiss(); } }; } /** * 获取焦点改变事件监听,设置EditText文本默认全选 * * @return 焦点改变事件监听 */ protected OnFocusChangeListener GetOnFocusChangeListener() { return new OnFocusChangeListener() { public void onFocusChange(View v, boolean hasFocus) { if (hasFocus && v instanceof EditText) { ((EditText) v).setSelection(0, ((EditText) v).getText().length()); } } }; } /** * 设置成功事件监听,用于提供给调用者的回调函数 * * @param listener 成功事件监听 */ public void SetOnSuccessListener(OnClickListener listener) { onSuccessListener = listener; } /** * 设置关闭事件监听,用于提供给调用者的回调函数 * * @param listener 关闭事件监听 */ public void SetOnDismissListener(OnDismissListener listener) { onDismissListener = listener; } /** * 提供给取消按钮,用于实现类定制 * * @param listener */ public void SetOnCancelListener(OnClickListener listener) { onCancelListener = listener; } /** * 创建方法,用于子类定制创建过程 */ protected abstract void onBuilding(); /** * 确认按钮单击方法,用于子类定制 */ protected abstract boolean OnClickPositiveButton(); /** * 取消按钮单击方法,用于子类定制 */ protected abstract void OnClickNegativeButton(); /** * 关闭方法,用于子类定制 */ protected abstract void onDismiss(); /** * @return 对话框标题 */ public String getTitle() { return title; } /** * @param title 对话框标题 */ public void setTitle(String title) { this.title = title; } /** * @return 标题图标的资源Id */ public int getIconTitle() { return iconTitle; } /** * @param iconTitle 标题图标的资源Id */ public void setIconTitle(int iconTitle) { this.iconTitle = iconTitle; } /** * @return 对话框提示信息 */ protected String getMessage() { return message; } /** * @param message 对话框提示信息 */ protected void setMessage(String message) { this.message = message; } /** * @return 对话框View */ protected View getView() { return view; } /** * @param view 对话框View */ protected void setView(View view) { this.view = view; } /** * @return 是否全屏 */ public boolean getIsFullScreen() { return isFullScreen; } /** * @param isFullScreen 是否全屏 */ public void setIsFullScreen(boolean isFullScreen) { this.isFullScreen = isFullScreen; } public boolean isHasTitle() { return hasTitle; } public void setHasTitle(boolean hasTitle) { this.hasTitle = hasTitle; } /** * @return 对话框宽度 */ protected int getWidth() { return width; } /** * @param width 对话框宽度 */ protected void setWidth(int width) { this.width = width; } /** * @return 对话框高度 */ protected int getHeight() { return height; } /** * @param height 对话框高度 */ protected void setHeight(int height) { this.height = height; } /** * @return 对话框X坐标 */ public int getX() { return x; } /** * @param x 对话框X坐标 */ public void setX(int x) { this.x = x; } /** * @return 对话框Y坐标 */ public int getY() { return y; } /** * @param y 对话框Y坐标 */ public void setY(int y) { this.y = y; } /** * @return 确认按钮名称 */ protected String getNamePositiveButton() { return namePositiveButton; } /** * @param namePositiveButton 确认按钮名称 */ protected void setNamePositiveButton(String namePositiveButton) { this.namePositiveButton = namePositiveButton; } /** * @return 取消按钮名称 */ protected String getNameNegativeButton() { return nameNegativeButton; } /** * @param nameNegativeButton 取消按钮名称 */ protected void setNameNegativeButton(String nameNegativeButton) { this.nameNegativeButton = nameNegativeButton; } }