Android自定义Dialog

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值