package com.mcxiaoke.next.ui.dialog.v4;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import java.util.Arrays;
/**
* 一个自定义的DialogFragment
* 接口和功能基本等同于系统的AlertDialog
* User: mcxiaoke
* Date: 13-6-16
* Date: 13-10-23
* Time: 下午6:28
*/
public class AlertDialogFragment extends DialogFragment {
public static final String TAG = AlertDialogFragment.class.getSimpleName();
public static final boolean DEBUG = false;
public static AlertDialogFragment create(Context context, CharSequence title, CharSequence message) {
Builder builder = new Builder(context);
builder.setTitle(title).setMessage(message);
return builder.create();
}
private Params mParams;
void setParams(Params params) {
mParams = params;
}
public void setTitle(CharSequence title) {
mParams.mTitle = title;
}
public void setMessage(CharSequence message) {
mParams.mMessage = message;
}
public void setIcon(int iconId) {
mParams.mIconId = iconId;
}
public void setIcon(Drawable icon) {
mParams.mIcon = icon;
}
public void setPositiveButton(CharSequence text, final DialogInterface.OnClickListener listener) {
mParams.mPositiveButtonText = text;
mParams.mPositiveButtonListener = listener;
}
public void setNegativeButton(CharSequence text, final DialogInterface.OnClickListener listener) {
mParams.mNegativeButtonText = text;
mParams.mNegativeButtonListener = listener;
}
public void setNeutralButton(CharSequence text, final DialogInterface.OnClickListener listener) {
mParams.mNeutralButtonText = text;
mParams.mNeutralButtonListener = listener;
}
public void setCancelable(boolean cancelable) {
mParams.mCancelable = cancelable;
}
public void setCanceledOnTouchOutside(boolean canceledOnTouchOutside) {
mParams.mCanceledOnTouchOutside = canceledOnTouchOutside;
}
public void setOnCancelListener(DialogInterface.OnCancelListener onCancelListener) {
mParams.mOnCancelListener = onCancelListener;
}
public void setOnDismissListener(DialogInterface.OnDismissListener onDismissListener) {
mParams.mOnDismissListener = onDismissListener;
}
public void setOnKeyListener(DialogInterface.OnKeyListener onKeyListener) {
mParams.mOnKeyListener = onKeyListener;
}
public void setItems(CharSequence[] items, final DialogInterface.OnClickListener listener) {
mParams.mItems = items;
mParams.mOnClickListener = listener;
}
public void setAdapter(final ListAdapter adapter, final DialogInterface.OnClickListener listener) {
mParams.mAdapter = adapter;
mParams.mOnClickListener = listener;
}
public void setView(View view) {
mParams.mView = view;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (DEBUG) {
Log.v(TAG, "onCreate()");
}
}
@Override
public Dialog onCreateDialog(Bundle bundle) {
if (DEBUG) {
Log.v(TAG, "onCreateDialog() mParams=" + mParams);
}
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
if (mParams.mIconId > 0) {
builder.setIcon(mParams.mIconId);
} else if (mParams.mIcon != null) {
builder.setIcon(mParams.mIcon);
}
if (mParams.mTitle != null) {
builder.setTitle(mParams.mTitle);
}
if (mParams.mMessage != null) {
builder.setMessage(mParams.mMessage);
}
if (mParams.mPositiveButtonText != null) {
builder.setPositiveButton(mParams.mPositiveButtonText, mParams.mPositiveButtonListener);
}
if (mParams.mNegativeButtonText != null) {
builder.setNegativeButton(mParams.mNegativeButtonText, mParams.mNegativeButtonListener);
}
if (mParams.mNeutralButtonText != null) {
builder.setNeutralButton(mParams.mNeutralButtonText, mParams.mNeutralButtonListener);
}
if (mParams.mCustomTitleView != null) {
builder.setCustomTitle(mParams.mCustomTitleView);
}
if (mParams.mView != null) {
builder.setView(mParams.mView);
}
if (mParams.mIsSingleChoice) {
if (mParams.mItems != null) {
builder.setSingleChoiceItems(mParams.mItems, mParams.mCheckedItem, mParams.mOnClickListener);
} else if (mParams.mAdapter != null) {
builder.setSingleChoiceItems(mParams.mAdapter, mParams.mCheckedItem, mParams.mOnClickListener);
}
} else if (mParams.mIsMultiChoice) {
if (mParams.mItems != null) {
builder.setMultiChoiceItems(mParams.mItems, mParams.mCheckedItems, mParams.mOnCheckboxClickListener);
}
} else {
if (mParams.mItems != null) {
builder.setItems(mParams.mItems, mParams.mOnClickListener);
} else if (mParams.mAdapter != null) {
builder.setAdapter(mParams.mAdapter, mParams.mOnClickListener);
}
}
builder.setCancelable(mParams.mCancelable);
builder.setOnKeyListener(mParams.mOnKeyListener);
AlertDialog dialog = builder.create();
if (mParams.mWindowNoTitle) {
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
}
dialog.setCanceledOnTouchOutside(mParams.mCanceledOnTouchOutside);
return dialog;
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
if (DEBUG) {
Log.v(TAG, "onDismiss()");
}
if (mParams.mOnDismissListener != null) {
mParams.mOnDismissListener.onDismiss(dialog);
}
}
@Override
public void onCancel(DialogInterface dialog) {
super.onCancel(dialog);
if (DEBUG) {
Log.v(TAG, "onCancel()");
}
if (mParams.mOnCancelListener != null) {
mParams.mOnCancelListener.onCancel(dialog);
}
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public void dismiss() {
super.dismiss();
}
@Override
public void dismissAllowingStateLoss() {
super.dismissAllowingStateLoss();
}
static class Params {
// 主题
public int mTheme;
// 是否隐藏标题栏
public boolean mWindowNoTitle;
// 图标
public int mIconId;
// 图标
public Drawable mIcon;
// 标题
public CharSequence mTitle;
// 自定义标题栏
public View mCustomTitleView;
// 内容
public CharSequence mMessage;
// 按钮
public CharSequence mPositiveButtonText;
public DialogInterface.OnClickListener mPositiveButtonListener;
// 按钮
public CharSequence mNegativeButtonText;
public DialogInterface.OnClickListener mNegativeButtonListener;
// 按钮
public CharSequence mNeutralButtonText;
public DialogInterface.OnClickListener mNeutralButtonListener;
// 是否可以Cancel,默认为true
public boolean mCancelable = true;
// 是否触摸对话框意外区域Cancel
public boolean mCanceledOnTouchOutside;
// 几个Listener
public DialogInterface.OnCancelListener mOnCancelListener;
public DialogInterface.OnDismissListener mOnDismissListener;
public DialogInterface.OnKeyListener mOnKeyListener;
// 列表数据源
public CharSequence[] mItems;
public ListAdapter mAdapter;
public boolean[] mCheckedItems;
// 列表属性
public boolean mIsMultiChoice;
public boolean mIsSingleChoice;
public int mCheckedItem = -1;
// 列表Listener
public DialogInterface.OnClickListener mOnClickListener;
public DialogInterface.OnMultiChoiceClickListener mOnCheckboxClickListener;
public AdapterView.OnItemSelectedListener mOnItemSelectedListener;
// 自定义View
public View mView;
@Override
public String toString() {
return "Params{" +
"mTheme=" + mTheme +
", mWindowNoTitle=" + mWindowNoTitle +
", mIconId=" + mIconId +
", mIcon=" + mIcon +
", mTitle=" + mTitle +
", mCustomTitleView=" + mCustomTitleView +
", mMessage=" + mMessage +
", mPositiveButtonText=" + mPositiveButtonText +
", mPositiveButtonListener=" + mPositiveButtonListener +
", mNegativeButtonText=" + mNegativeButtonText +
", mNegativeButtonListener=" + mNegativeButtonListener +
", mNeutralButtonText=" + mNeutralButtonText +
", mNeutralButtonListener=" + mNeutralButtonListener +
", mCancelable=" + mCancelable +
", mCanceledOnTouchOutside=" + mCanceledOnTouchOutside +
", mOnCancelListener=" + mOnCancelListener +
", mOnDismissListener=" + mOnDismissListener +
", mOnKeyListener=" + mOnKeyListener +
", mItems=" + Arrays.toString(mItems) +
", mAdapter=" + mAdapter +
", mOnClickListener=" + mOnClickListener +
", mView=" + mView +
'}';
}
}
public static class Builder {
private Context mContext;
private Params mParams = new Params();
public Builder(Builder builder) {
mContext = builder.mContext;
mParams = builder.mParams;
}
public Builder(Context context) {
this(context, 0);
}
public Builder(Context context, int theme) {
mContext = context;
mParams.mTheme = theme;
}
public Context getContext() {
return mContext;
}
public Builder setTheme(int mTheme) {
this.mParams.mTheme = mTheme;
return this;
}
public int getTheme() {
return mParams.mTheme;
}
public Builder setWindowNoTitle(boolean noTitle) {
this.mParams.mWindowNoTitle = noTitle;
return this;
}
public boolean isWindowNoTitle() {
return mParams.mWindowNoTitle;
}
public Builder setTitle(int titleId) {
mParams.mTitle = mContext.getText(titleId);
return this;
}
public Builder setTitle(CharSequence title) {
mParams.mTitle = title;
return this;
}
public Builder setCustomTitle(View customTitleView) {
mParams.mCustomTitleView = customTitleView;
return this;
}
public Builder setMessage(int messageId) {
mParams.mMessage = mContext.getText(messageId);
return this;
}
public Builder setMessage(CharSequence message) {
mParams.mMessage = message;
return this;
}
public Builder setIcon(int iconId) {
mParams.mIconId = iconId;
return this;
}
public Builder setIcon(Drawable icon) {
mParams.mIcon = icon;
return this;
}
public Builder setPositiveButton(int textId, final DialogInterface.OnClickListener listener) {
mParams.mPositiveButtonText = mContext.getText(textId);
mParams.mPositiveButtonListener = listener;
return this;
}
public Builder setPositiveButton(CharSequence text, final DialogInterface.OnClickListener listener) {
mParams.mPositiveButtonText = text;
mParams.mPositiveButtonListener = listener;
return this;
}
public Builder setNegativeButton(int textId, final DialogInterface.OnClickListener listener) {
mParams.mNegativeButtonText = mContext.getText(textId);
mParams.mNegativeButtonListener = listener;
return this;
}
public Builder setNegativeButton(CharSequence text, final DialogInterface.OnClickListener listener) {
mParams.mNegativeButtonText = text;
mParams.mNegativeButtonListener = listener;
return this;
}
public Builder setNeutralButton(int textId, final DialogInterface.OnClickListener listener) {
mParams.mNeutralButtonText = mContext.getText(textId);
mParams.mNeutralButtonListener = listener;
return this;
}
public Builder setNeutralButton(CharSequence text, final DialogInterface.OnClickListener listener) {
mParams.mNeutralButtonText = text;
mParams.mNeutralButtonListener = listener;
return this;
}
public Builder setCancelable(boolean cancelable) {
mParams.mCancelable = cancelable;
return this;
}
public Builder setCanceledOnTouchOutside(boolean canceledOnTouchOutside) {
mParams.mCanceledOnTouchOutside = canceledOnTouchOutside;
return this;
}
public Builder setOnCancelListener(DialogInterface.OnCancelListener onCancelListener) {
mParams.mOnCancelListener = onCancelListener;
return this;
}
public Builder setOnDismissListener(DialogInterface.OnDismissListener onDismissListener) {
mParams.mOnDismissListener = onDismissListener;
return this;
}
public Builder setOnKeyListener(DialogInterface.OnKeyListener onKeyListener) {
mParams.mOnKeyListener = onKeyListener;
return this;
}
public Builder setItems(int itemsId, final DialogInterface.OnClickListener listener) {
mParams.mItems = mContext.getResources().getTextArray(itemsId);
mParams.mOnClickListener = listener;
return this;
}
public Builder setItems(CharSequence[] items, final DialogInterface.OnClickListener listener) {
mParams.mItems = items;
mParams.mOnClickListener = listener;
return this;
}
public Builder setAdapter(final ListAdapter adapter, final DialogInterface.OnClickListener listener) {
mParams.mAdapter = adapter;
mParams.mOnClickListener = listener;
return this;
}
public Builder setMultiChoiceItems(int itemsId, boolean[] checkedItems,
final DialogInterface.OnMultiChoiceClickListener listener) {
mParams.mItems = mContext.getResources().getTextArray(itemsId);
mParams.mOnCheckboxClickListener = listener;
mParams.mCheckedItems = checkedItems;
mParams.mIsMultiChoice = true;
return this;
}
public Builder setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems,
final DialogInterface.OnMultiChoiceClickListener listener) {
mParams.mItems = items;
mParams.mOnCheckboxClickListener = listener;
mParams.mCheckedItems = checkedItems;
mParams.mIsMultiChoice = true;
return this;
}
public Builder setSingleChoiceItems(int itemsId, int checkedItem,
final DialogInterface.OnClickListener listener) {
mParams.mItems = mContext.getResources().getTextArray(itemsId);
mParams.mOnClickListener = listener;
mParams.mCheckedItem = checkedItem;
mParams.mIsSingleChoice = true;
return this;
}
public Builder setSingleChoiceItems(CharSequence[] items, int checkedItem, final DialogInterface.OnClickListener listener) {
mParams.mItems = items;
mParams.mOnClickListener = listener;
mParams.mCheckedItem = checkedItem;
mParams.mIsSingleChoice = true;
return this;
}
public Builder setSingleChoiceItems(ListAdapter adapter, int checkedItem, final DialogInterface.OnClickListener listener) {
mParams.mAdapter = adapter;
mParams.mOnClickListener = listener;
mParams.mCheckedItem = checkedItem;
mParams.mIsSingleChoice = true;
return this;
}
public Builder setOnItemSelectedListener(final AdapterView.OnItemSelectedListener listener) {
mParams.mOnItemSelectedListener = listener;
return this;
}
public Builder setView(View view) {
mParams.mView = view;
return this;
}
public AlertDialogFragment create() {
AlertDialogFragment fragment = new AlertDialogFragment();
fragment.setParams(mParams);
return fragment;
}
}
}