Android自定义Dialog

来源:互联网 发布:网络征文比赛2017 编辑:程序博客网 时间:2024/06/16 09:08

最近需求是要实现自定义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~~

原创粉丝点击