封装一个通用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 SparseArray<View> views;
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 <T>
* @return
*/
public <T extends View> 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());
}
}