搜索
您的当前位置:首页正文

Android 方便自定义的Dialog

来源:二三娱乐

开发时UI总是会设计出一些漂亮的Dialog,但是这些Dialog长的都不一样。显示的内容也不同
每次都得使用new Dialog去做一大堆的设置,于是想要上网搜一下通用的框架来减少这种操作,
试了几个发现总是不能满足要求。既然没有轮子,咱就自己造轮子吧
不知道从Android几开始,官方推荐使用DialogFragment了,于是咱的轮子也从DialogFragment开始吧

public class DMDialog extends DialogFragment
{
    @Nullable
    public View onCreateView(@NonNull LayoutInflater paramLayoutInflater, @Nullable ViewGroup paramViewGroup, @Nullable Bundle paramBundle)
    {
    }
}

onCreateView中返回对应的layout即可。
但是如果每次都要重写这个过程太复杂了,于是就想到了使用builder模式,由使用者传入layout就行了。我们还可以在builder中设置其他想要属性。例如cancelable,gravity之类的

public static class DialogParams implements Serializable
{
        boolean cancelable = true;
        float dimAmount = 0.4F;
        int gravity = Gravity.BOTTOM;
        int layoutId;
}

继承Serializable的主要原因是在DialogFragment被系统回收后,再次启动还能还原。
同时我们还需要在DMDialog创建完成后初始化控件,于是就需要加入一个监听,于是onCreateView变成这样了

public class DMDialog extends DialogFragment
{
    DialogParams dialogParams;
    View mRoot;
    OnDialogInitListener onDialogInitListener;

    @Nullable
    public View onCreateView(@NonNull LayoutInflater paramLayoutInflater, @Nullable ViewGroup paramViewGroup, @Nullable Bundle paramBundle)
    {
        getDialog().requestWindowFeature(1);
        this.dialogParams = ((DialogParams) getArguments().getSerializable("params"));
        this.mRoot = paramLayoutInflater.inflate(this.dialogParams.layoutId, paramViewGroup);
        setCancelable(this.dialogParams.cancelable);
        if (this.onDialogInitListener != null)
        {
            this.onDialogInitListener.convert(new ViewHelper(this.mRoot), this);
        }
        return this.mRoot;
    }
}

OnDialogInitListener是这样的

public interface OnDialogInitListener
{
    void convert(ViewHelper paramViewHelper, DMDialog dialog);
}

ViewHelper 中定义了一系列快捷操作,可以方便的设置view的属性。
最后使用的方式就很简单了,

TDialog.builder(getActivity(), R.layout.dialog_map_nav_app_sel).onDialogInitListener((helper, dialog) ->
        {
            View.OnClickListener listener = v ->
            {
                switch (v.getId())
                {
                }

                dialog.dismiss();
            };

            helper.setOnClickListener(R.id.tv_baidumap, listener);
            helper.setOnClickListener(R.id.tv_amap, listener);
            helper.setOnClickListener(R.id.btn_cancel, listener);
        }).show();
Top