最近需求是要实现自定义Dialog,然后研究了一下,写出下面的效果
实现步骤如下:
①先写一个基类CustomDialog ,基础原生Dialog
public class CustomDialog extends Dialog {
private View convertView;
/**
* 构造函数,
* @param context 上下文
* @param layoutId 传递自定义Dialog的XML资源文件ID
*/
public CustomDialog(Context context, int layoutId) {
super(context);
//填充XML
convertView = LayoutInflater.from(context).inflate(layoutId, null);
//设置没有标题栏
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.setContentView(convertView);
//设置窗口背景透明
getWindow().setBackgroundDrawableResource(android.R.color.transparent);
}
public <T extends View> T getView(int viewId){
return (T) convertView.findViewById(viewId);
}
public String getText(int viewId){
return ((TextView) getView(viewId)).getText().toString();
}
public CustomDialog setText(int viewId, String text){
((TextView) getView(viewId)).setText(text);
return this;
}
public CustomDialog setViewOnClickListener(int viewId, View.OnClickListener listener){
View view = getView(viewId);
if (view != null)
view.setOnClickListener(listener);
return this;
}
@Override
public void show() {
if (!isShowing()) super.show();
}
@Override
public void dismiss() {
if (isShowing()) super.dismiss();
}
}
②然后利用上面写好的基类去写一个真正要用到的dialog,例如下面实现一个带加载提示的dialog
当然,首先写好我的自定义dialog的界面XML文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/loading_dialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="15dp"
android:paddingBottom="15dp"
android:paddingLeft="30dp"
android:paddingRight="30dp"
android:background="@drawable/circle_corner_frame"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/iv_loading"
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@mipmap/reload" />
<TextView
android:id="@+id/tv_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="刷新中"
android:textSize="18sp" />
</LinearLayout>
然后创建一个LoadingDialog类继承刚才写好的CustomDialog
public class LoadingDialog extends CustomDialog{
private ImageView iv_loading;
//旋转的动画
private Animation rotate;
private OnBackListener onBackListener;
public LoadingDialog(Context context) {
super(context, R.layout.dialog_loading);
//从0度旋转到360度
rotate = new RotateAnimation(0, 360,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
//设置时间周期为1秒
rotate.setDuration(1000);
//无限重复
rotate.setRepeatCount(-1);
//设置加速器(匀速)
rotate.setInterpolator(new LinearInterpolator());
iv_loading = getView(R.id.iv_loading);
//不能被取消
setCancelable(false);
//监听返回键
setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialogInterface, int i, KeyEvent keyEvent) {
if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_BACK && keyEvent.getAction() == KeyEvent.ACTION_DOWN){
if (onBackListener != null){
onBackListener.onBack();
}
}
return true;
}
});
}
@Override
public void show() {
super.show();
iv_loading.startAnimation(rotate);
}
/**
* @param msg 提示文字
*/
public void show(String msg){
((TextView) getView(R.id.tv_msg)).setText(msg);
show();
}
public void show(int stringId){
((TextView) getView(R.id.tv_msg)).setText(stringId);
show();
}
/**
* 设置提示文字
*/
public void setText(String msg){
((TextView) getView(R.id.tv_msg)).setText(msg);
}
/**
* 返回键的监听事件
*/
public void setOnBackListener(OnBackListener l){
this.onBackListener = l;
}
@Override
public void dismiss() {
if (isShowing()) {
super.dismiss();
iv_loading.clearAnimation();
}
}
/**
* 按返回键的回调
*/
public interface OnBackListener {
void onBack();
}
}
③接下来,看如何调用,很简单,直接实例化这个对象,然后调用show方法就可以了
//传递上下文作为参数
LoadingDialog progressDialog = new LoadingDialog(this);
progressDialog.show();
要隐藏这个Dialog就调用器dismiss函数
progressDialog.dismiss();
至此,一个简单的自定义Dialog实现。如果帮助到您,请点一下赞哦,O(∩_∩)O~~