利用建造者模式封装一个简单好用的dialog
2018-06-14 本文已影响785人
等风来_Android
本着不再重复造轮子的精神,封装一个简单实用的Dialog,
1,支持自定义布局
2,支持设置显示位置以及与屏幕边距
3,随心所欲的添加动画效果
4,添加子View接口回调,可以为所有子View添加点击事件
5,链式调用,一行实现添加所有属性以及回调
代码如下:
public class DialogUtils {
private Context mContext;
private int layoutId;
private int layoutPosition;
private int padingTop;
private int padingBottom;
private int padingRight;
private int padingLeft;
/**
* 静态内部类的方式构建单例模式
*/
private DialogUtils(){}
private static class DialogHolder{
private static DialogUtils instance= new DialogUtils();
}
public static DialogUtils getInstance(){
return DialogHolder.instance;
}
/**
* 传入上下文
* @param context
* @return
*/
public final DialogUtils with(Context context){
this.mContext= context;
return this;
}
/**
* 传入弹窗需要的布局
* @param layoutId
* @return
*/
public final DialogUtils setlayoutId(int layoutId){
this.layoutId= layoutId;
return this;
}
/**
* 设置弹窗的位置
* @param layoutPosition
* @return
*/
public final DialogUtils setlayoutPosition(int layoutPosition){
this.layoutPosition= layoutPosition;
return this;
}
/**
* 设置弹窗距离屏幕的距离
* @param padingLeft
* @param padingTop
* @param padingRight
* @param padingBottom
* @return
*/
public final DialogUtils setlayoutPading(int padingLeft,int padingTop,int padingRight,int padingBottom){
this.padingLeft= padingLeft;
this.padingTop= padingTop;
this.padingRight= padingRight;
this.padingBottom= padingBottom;
return this;
}
public void show(){
Dialog dialog = new Dialog(mContext, R.style.ActionSheetDialogStyle);
View view = LayoutInflater.from(mContext).inflate(layoutId, null);
dialog.setContentView(view);
//获得dialog的window窗口
Window window = dialog.getWindow();
//设置dialog在屏幕位置
window.setGravity(layoutPosition);
window.getDecorView().setPadding(padingLeft, padingTop, padingRight, padingBottom);
//获得window窗口的属性
android.view.WindowManager.LayoutParams lp = window.getAttributes();
//设置窗口宽度为充满全屏
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
//设置窗口高度为包裹内容
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
//将设置好的属性set回去
window.setAttributes(lp);
dialog.show();
}
添加回调接口:
public interface ViewInterface {
void getChildView(View view, int layoutResId);
}
/**
* 设置子View
*
* @param listener ViewInterface
* @return Builder
*/
public DialogUtils setOnChildViewclickListener(DialogUtils.ViewInterface listener) {
this.listener = listener;
return this;
}
设置弹窗消失:
public static void dismiss(){
if (dialog!=null && dialog.isShowing()){
dialog.dismiss();
}
}
加入自定义动画:
switch (dialogAnimaType){
case 0:
//自下而上动画
dialog = new Dialog(mContext, R.style.ActionSheetDialogStyle);
break;
case 1:
//淡入淡出缩放动画
dialog = new Dialog(mContext, R.style.ActionSheetDialogStyle1);
break;
}
然后调用:
DialogUtils.getInstance()
.with(getApplicationContext())//上下文
.setlayoutId(R.layout.make_money_pop_window_layout)//布局文件
.setlayoutPosition(Gravity.BOTTOM)//位置
.setlayoutAnimaType(0)//动画类型:0自下而上动画,1淡入淡出动画
.setlayoutPading(20, 0, 20, 20)//与屏幕距离
.setOnChildViewclickListener(new DialogUtils.ViewInterface() {
@Override
public void getChildView(View view, int layoutResId) {
//处理dialog内部控件的点击事件
LinearLayout weichat_share_ll= view.findViewById(R.id.weichat_share_ll);
weichat_share_ll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"微信",Toast.LENGTH_SHORT).show();
}
});
TextView disMissTv= view.findViewById(R.id.share_dismiss_tv);
disMissTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DialogUtils.dismiss();
}
});
}
})
.show();
附上两张效果图:
![](https://img.haomeiwen.com/i5833840/232edfc98d2bfe08.png)
![](https://img.haomeiwen.com/i5833840/0677bb9514787de4.png)
Demo地址:点这里