封装一个通用Dialog,使用DialogFragment有很多优势。
从代码的编写角度看,Dialog使用起来要更为简单 Android 官方推荐使用 DialogFragment 来代替 Dialog ,可以让它具有更高的可复用性(降低耦合)和更好的便利性(很好的处理屏幕翻转的情况)。 DialogFragment果然有一个非常好的特性(在手机配置变化,导致Activity需要重新创建时 例如旋屏,基于DialogFragment的对话框将会由FragmentManager自动重建,然而基于Dialog实现的对话框则没有这样的能力)。
直接开始干吧,注释直接写在代码里了:
BaseDialog
/** * Dialog通用样式 */ public abstract class BaseDialog extends DialogFragment { @LayoutRes protected int mLayoutResId; private float mDimAmount = 0.5f;//背景昏暗度 private boolean mShowBottomEnable;//是否底部显示 private int mMargin = 0;//左右边距 private int mAnimStyle = 0;//进入退出动画 private boolean mOutCancel = true;//点击外部取消 private Context mContext; private int mWidth; private int mHeight; @Override public void onAttach(Context context) { super.onAttach(context); mContext = context; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NO_TITLE, R.style.BaseDialog); mLayoutResId = setUpLayoutId(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(mLayoutResId, container, false); convertView(ViewHolder.create(view), this); return view; } @Override public void onStart() { super.onStart(); initParams(); } private void initParams() { Window window = getDialog().getWindow(); if (window != null) { WindowManager.LayoutParams params = window.getAttributes(); params.dimAmount = mDimAmount; //设置dialog显示位置 if (mShowBottomEnable) { params.gravity = Gravity.BOTTOM; } //设置dialog宽度 if (mWidth == 0) { params.width = getScreenWidth(getContext()) - 2 * dp2px(getContext(), mMargin); } else { params.width = dp2px(getContext(), mWidth); } //设置dialog高度 if (mHeight == 0) { params.height = WindowManager.LayoutParams.WRAP_CONTENT; } else { params.height = dp2px(getContext(), mHeight); } //设置dialog动画 if (mAnimStyle != 0) { window.setWindowAnimations(mAnimStyle); } window.setAttributes(params); } setCancelable(mOutCancel); } /** * 设置背景昏暗度 * * @param dimAmount * @return */ public BaseDialog setDimAmout(@FloatRange(from = 0, to = 1) float dimAmount) { mDimAmount = dimAmount; return this; } /** * 是否显示底部 * * @param showBottom * @return */ public BaseDialog setShowBottom(boolean showBottom) { mShowBottomEnable = showBottom; return this; } /** * 设置宽高 * * @param width * @param height * @return */ public BaseDialog setSize(int width, int height) { mWidth = width; mHeight = height; return this; } /** * 设置左右margin * * @param margin * @return */ public BaseDialog setMargin(int margin) { mMargin = margin; return this; } /** * 设置进入退出动画 * * @param animStyle * @return */ public BaseDialog setAnimStyle(@StyleRes int animStyle) { mAnimStyle = animStyle; return this; } /** * 设置是否点击外部取消 * * @param outCancel * @return */ public BaseDialog setOutCancel(boolean outCancel) { mOutCancel = outCancel; return this; } public BaseDialog show(FragmentManager manager) { super.show(manager, String.valueOf(System.currentTimeMillis())); return this; } /** * 设置dialog布局 * * @return */ public abstract int setUpLayoutId(); /** * 操作dialog布局 * * @param holder * @param dialog */ public abstract void convertView(ViewHolder holder, BaseDialog dialog); /** * 获取屏幕宽度 * * @param context * @return */ public static int getScreenWidth(Context context) { DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); return displayMetrics.widthPixels; } public static int dp2px(Context context, float dipValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dipValue * scale + 0.5f); } }
ViewHolder
public class ViewHolder { private SparseArrayviews; private View convertView; private ViewHolder(View view) { convertView = view; views = new SparseArray<>(); } public static ViewHolder create(View view) { return new ViewHolder(view); } /** * 获取View * * @param viewId * @param * @return */ public T getView(@IdRes int viewId) { View view = views.get(viewId); if (view == null) { view = convertView.findViewById(viewId); views.put(viewId, view); } return (T) view; } /** * 设置文本 * * @param viewId * @param text */ public void setText(int viewId, String text) { TextView textView = getView(viewId); textView.setText(text); } /** * 设置字体颜色 * * @param viewId * @param colorId */ public void setTextColor(int viewId, int colorId) { TextView textView = getView(viewId); textView.setTextColor(colorId); } /** * 设置背景图片 * * @param viewId * @param resId */ public void setBackgroundResource(int viewId, int resId) { View view = getView(viewId); view.setBackgroundResource(resId); } /** * 设置背景颜色 * * @param viewId * @param colorId */ public void setBackgroundColor(int viewId, int colorId) { View view = getView(viewId); view.setBackgroundColor(colorId); } /** * 设置点击事件 * * @param viewId * @param listener */ public void setOnClickListener(int viewId, View.OnClickListener listener) { View view = getView(viewId); view.setOnClickListener(listener); } }
确定样式:ConfirmDialog
/** * 确定样式Dialog */ public class ConfirmDialog extends BaseDialog { private String type; public static ConfirmDialog newInstance(String type) { Bundle bundle = new Bundle(); bundle.putString("type", type); ConfirmDialog dialog = new ConfirmDialog(); dialog.setArguments(bundle); return dialog; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle bundle = getArguments(); if (bundle == null) { return; } type = bundle.getString("type"); } @Override public int setUpLayoutId() { return R.layout.dialog_confirm; } @Override public void convertView(ViewHolder holder, final BaseDialog dialog) { if ("1".equals(type)) { holder.setText(R.id.title, "提示"); holder.setText(R.id.message, "您已支付成功!"); } else if ("2".equals(type)) { holder.setText(R.id.title, "警告"); holder.setText(R.id.message, "您的帐号已被冻结!"); } holder.setOnClickListener(R.id.cancel, new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }); holder.setOnClickListener(R.id.confirm, new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); Toast.makeText(getContext(), "确定", Toast.LENGTH_SHORT).show(); } }); } }
通用样式:CommonDialog
/** * 公用样式Dialog */ public class CommonDialog extends BaseDialog { private ViewConvertListener convertListener; public static CommonDialog newInstance() { CommonDialog dialog = new CommonDialog(); return dialog; } /** * 设置Dialog布局 * * @param layoutId * @return */ public CommonDialog setLayoutId(@LayoutRes int layoutId) { this.mLayoutResId = layoutId; return this; } @Override public int setUpLayoutId() { return mLayoutResId; } @Override public void convertView(ViewHolder holder, BaseDialog dialog) { if (convertListener != null) { convertListener.convertView(holder, dialog); } } public CommonDialog setConvertListener(ViewConvertListener convertListener) { this.convertListener = convertListener; return this; } }
测试
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } //确定样式一 public void showConfirmClick(View view) { ConfirmDialog.newInstance("1") .setMargin(60) .setOutCancel(false) .show(getSupportFragmentManager()); } //确定样式二 public void showConfirm2Click(View view) { ConfirmDialog.newInstance("2") .setMargin(60) .setOutCancel(true) .show(getSupportFragmentManager()); } //分享样式 public void showShareClick(View view) { CommonDialog.newInstance() .setLayoutId(R.layout.dialog_share) .setConvertListener(new ViewConvertListener() { @Override public void convertView(ViewHolder holder, final BaseDialog dialog) { holder.setOnClickListener(R.id.tv_weixin_share, new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "微信分享", Toast.LENGTH_SHORT).show(); dialog.dismiss(); } }); } }) .setDimAmout(0.3f) .setShowBottom(true) .setAnimStyle(R.style.EnterExitAnimation) .show(getSupportFragmentManager()); } //好有设置 public void showFriendClick(View view) { CommonDialog.newInstance() .setLayoutId(R.layout.dialog_friend) .setConvertListener(new ViewConvertListener() { @Override public void convertView(ViewHolder holder, final BaseDialog dialog) { } }) .setShowBottom(true) .setSize(0, 310) .show(getSupportFragmentManager()); } //评论样式 public void showCommentClick(View view) { CommonDialog.newInstance() .setLayoutId(R.layout.dialog_comment) .setConvertListener(new ViewConvertListener() { @Override public void convertView(ViewHolder holder, final BaseDialog dialog) { final EditText et_input = holder.getView(R.id.edit_input); holder.setOnClickListener(R.id.tv_commit, new View.OnClickListener() { @Override public void onClick(View v) { String text = et_input.getText().toString().trim(); text = TextUtils.isEmpty(text) ? "请输入文字" : et_input.getText().toString().trim(); Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show(); dialog.dismiss(); } }); } }) .setShowBottom(true) .show(getSupportFragmentManager()); } }