开发时UI总是会设计出一些漂亮的Dialog,但是这些Dialog长的都不一样。显示的内容也不同
每次都得使用new Dialog去做一大堆的设置,于是想要上网搜一下通用的框架来减少这种操作,
试了几个发现总是不能满足要求。既然没有轮子,咱就自己造轮子吧
不知道从Android几开始,官方推荐使用DialogFragment了,于是咱的轮子也从DialogFragment开始吧
public class DMDialog extends DialogFragment
{
@Nullable
public View onCreateView(@NonNull LayoutInflater paramLayoutInflater, @Nullable ViewGroup paramViewGroup, @Nullable Bundle paramBundle)
{
}
}
onCreateView中返回对应的layout即可。
但是如果每次都要重写这个过程太复杂了,于是就想到了使用builder模式,由使用者传入layout就行了。我们还可以在builder中设置其他想要属性。例如cancelable,gravity之类的
public static class DialogParams implements Serializable
{
boolean cancelable = true;
float dimAmount = 0.4F;
int gravity = Gravity.BOTTOM;
int layoutId;
}
继承Serializable的主要原因是在DialogFragment被系统回收后,再次启动还能还原。
同时我们还需要在DMDialog创建完成后初始化控件,于是就需要加入一个监听,于是onCreateView变成这样了
public class DMDialog extends DialogFragment
{
DialogParams dialogParams;
View mRoot;
OnDialogInitListener onDialogInitListener;
@Nullable
public View onCreateView(@NonNull LayoutInflater paramLayoutInflater, @Nullable ViewGroup paramViewGroup, @Nullable Bundle paramBundle)
{
getDialog().requestWindowFeature(1);
this.dialogParams = ((DialogParams) getArguments().getSerializable("params"));
this.mRoot = paramLayoutInflater.inflate(this.dialogParams.layoutId, paramViewGroup);
setCancelable(this.dialogParams.cancelable);
if (this.onDialogInitListener != null)
{
this.onDialogInitListener.convert(new ViewHelper(this.mRoot), this);
}
return this.mRoot;
}
}
OnDialogInitListener是这样的
public interface OnDialogInitListener
{
void convert(ViewHelper paramViewHelper, DMDialog dialog);
}
ViewHelper 中定义了一系列快捷操作,可以方便的设置view的属性。
最后使用的方式就很简单了,
TDialog.builder(getActivity(), R.layout.dialog_map_nav_app_sel).onDialogInitListener((helper, dialog) ->
{
View.OnClickListener listener = v ->
{
switch (v.getId())
{
}
dialog.dismiss();
};
helper.setOnClickListener(R.id.tv_baidumap, listener);
helper.setOnClickListener(R.id.tv_amap, listener);
helper.setOnClickListener(R.id.btn_cancel, listener);
}).show();
代码已经上传到Github了,欢迎随便copy,喜欢的话也可以给个小星星