项目结构
1、基类BaseDialog
public abstract class BaseDialog extends Dialog{
public BaseDialog dialog;
public Activity activity;
public BaseDialog(@NonNull Activity activity) {
super(activity);
this.dialog=this;
this.activity=activity;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(initLayout());
DialogUtils.setWindowPublic(this);
initEvent();
}
public abstract int initLayout();
public abstract void initEvent();
/**
* 设置dialog其他屏幕地方是否触摸消失
* @param isSetCanceledOnTouchOutside
* @return
*/
public BaseDialog setCanceledOnTouchOutside(Boolean isSetCanceledOnTouchOutside) {
dialog.setCanceledOnTouchOutside(isSetCanceledOnTouchOutside);
return this;
}
/**
* 设置回退键是否有效
* @param isCancelable
* @return
*/
public BaseDialog setCancelable(Boolean isCancelable) {
dialog.setCancelable(isCancelable);
return this;
}
/**
* 显示dialog
* @return
*/
public BaseDialog showDialog() {
if(!isShowing()){
dialog.show();
}
return this;
}
/**
* 关闭dialog
* @return
*/
public BaseDialog hideDialog() {
if(isShowing()){
dialog.hide();
}
return this;
}
/**
* 设置回调 两个点击事件
*/
public CallBack callBack;
public interface CallBack{
void cancel();
void ok();
}
public BaseDialog setCallBack(CallBack callBack) {
this.callBack = callBack;
return this;
}
/**
* 设置点击一个条目
*/
public ClickSingleCallBack clickSingleCallBack;
public interface ClickSingleCallBack{
void click(String item);
}
public BaseDialog setClickSingleCallBack(ClickSingleCallBack clickSingleCallBack) {
this.clickSingleCallBack = clickSingleCallBack;
return this;
}
/**
* 设置照片回调
*/
public PhotoCallBack photoCallBack;
public interface PhotoCallBack{
void takePhoto();
void selectPhoto();
}
public BaseDialog setPhotoCallBack(PhotoCallBack photoCallBack) {
this.photoCallBack = photoCallBack;
return this;
}
}
解说
加载需要自定义dialog页面
setContentView(initLayout());
设置去除dialog状态栏黑色设置
DialogUtils.setWindowPublic(this);
设置点击事件处理
initEvent();
还有就是一些公用的设置,回退键是否有效、点击外面是否有效、关闭、显示dialog以及对于有“确认、取消”两个按键回调,对选择单个按钮按键回调。
DialogUtils工具类、提供动画效果设置等
public class DialogUtils {
public static void setWindowPublic(Dialog dialog){
Window window = dialog.getWindow();
int screenHeight = DensityUtils.getScreenHeight(dialog.getContext());
int statusBarHeight = DensityUtils.getStatusHeight(dialog.getContext());
int dialogHeight = screenHeight - statusBarHeight;
window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, dialogHeight == 0 ? ViewGroup.LayoutParams.MATCH_PARENT : dialogHeight);
window.setBackgroundDrawableResource(R.color.colorTransparent);
}
/**
* 上到下
* @param dialog
*/
public static void setWindowAnimationsTop(Dialog dialog){
Window window = dialog.getWindow();
window.setWindowAnimations(R.style.dialog_animation);
}
/**
* 下到上
* @param dialog
*/
public static void setWindowAnimationsButtom(Dialog dialog){
Window window = dialog.getWindow();
window.setWindowAnimations(R.style.dialogWindowAnimButtomToTop);
}
}
在style.xml定义
<!--从低到顶动画效果-->
<style name="dialogWindowAnimButtomToTop" parent="android:Animation" mce_bogus="1">
<item name="android:windowEnterAnimation">@anim/dialog_enter_anim</item>
<item name="android:windowExitAnimation">@anim/dialog_exit_anim</item>
</style>
<style name="dialog_animation" parent="@android:style/Animation.Dialog">
<item name="android:windowEnterAnimation">@anim/push_bottom_in</item>
<item name="android:windowExitAnimation">@anim/push_bottom_out</item>
</style>
dialog_enter_anim
<?xml version="1.0" encoding="utf-8"?>
<!-- 弹出时动画 -->
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fromYDelta="100%p"
android:toYDelta="0%p"
android:interpolator="@android:anim/accelerate_interpolator" />
</set>
dialog_exit_anim
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fromYDelta="0%p"
android:toYDelta="100%p"
android:interpolator="@android:anim/accelerate_interpolator" />
</set>
push_bottom_in
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="1500"
android:fromYDelta="-100%p"
android:toYDelta="0" />
</set>
push_bottom_out
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="1500"
android:fromYDelta="0"
android:toYDelta="-100%p" />
</set>
如果不需要动画效果可以不调用这个工具类。
实现一个提示框
public class SelectDialog extends BaseDialog {
private TextView dialog_ok;
private TextView dialog_cancel;
private TextView dialog_content;
private String content;
public SelectDialog(@NonNull Activity activity,String content) {
super(activity);
this.content=content;
}
@Override
public void