自定义dialog简单封装

安卓的dialog有很多种,什么AlertDialog、ProgressDialog、TimePickerDialog等等。虽然谷歌似乎帮我们做了很多封装,但实际应用时却感觉很不好用,比如我不想要title。下面我们就来仿照AlertDialog对我们自定义的dialog进行封装。没有封装的简单自定义点这,封装的好处我就不多说了。首先先看效果图。
自定义dialog简单封装_第1张图片 自定义dialog简单封装_第2张图片

其次我们把代码直接贴出来!

public class DialogBuilder {
    private Context context;
    private int themeResId;
    private View layout;
    private boolean cancelable = true;
    private CharSequence title, message, cancelText, sureText;//除了message的所有文本,不写则Gone。
    private View.OnClickListener sureClickListener, cancelClickListener;

    public DialogBuilder(Context context) {
        this(context, R.style.CustomDialog);
    }
    
    public DialogBuilder(Context context, int themeResId) {
        this(context, themeResId, ((LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.custom_dialog_layout, null));
    }
	//自定义layout用这个
    public DialogBuilder(Context context, int themeResId, View layout) {
        this.context = context;
        this.themeResId = themeResId;
        this.layout = layout;
    }

    //能否返回键取消
    public DialogBuilder setCancelable(Boolean cancelable) {
        this.cancelable = cancelable;
        return this;
    }

    public DialogBuilder title(CharSequence title) {
        this.title = title;
        return this;
    }

    public DialogBuilder message(CharSequence message) {
        this.message = message;
        return this;
    }

    public DialogBuilder cancelText(CharSequence str) {
        this.cancelText = str;
        return this;
    }

    //确定按钮文本
    public DialogBuilder sureText(CharSequence str) {
        this.sureText = str;
        return this;
    }

    public DialogBuilder setSureOnClickListener(View.OnClickListener listener) {
        this.sureClickListener = listener;
        return this;
    }

    public DialogBuilder setCancelOnClickListener(View.OnClickListener listener) {
        this.cancelClickListener = listener;
        return this;
    }

    public Dialog build() {
        final Dialog dialog = new Dialog(context, themeResId);
        dialog.setCancelable(cancelable);
        dialog.addContentView(layout, new ActionBar.LayoutParams(
                ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.WRAP_CONTENT));
        //设置显不显示
        setText(title, R.id.title);
        setText(message, R.id.message);
        setText(cancelText, R.id.cancel);
        setText(sureText, R.id.sure);
        if (isValid(cancelText) || isValid(sureText)) {
            layout.findViewById(R.id.line2).setVisibility(View.VISIBLE);
        }
        if (isValid(cancelText) && isValid(sureText)) {
            layout.findViewById(R.id.line).setVisibility(View.VISIBLE);
        }
        //没有title时message变大
        if(!isValid(title)){
            ((TextView)layout.findViewById(R.id.message)).setTextSize(TypedValue.COMPLEX_UNIT_DIP,16);
        }
        //一行居中
        final TextView textView = (TextView)layout.findViewById(R.id.message);
        textView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                if(textView.getLineCount() ==1){
                    textView.setGravity(Gravity.CENTER);
                }
                return true;
            }
        });
        //设置点击监听
        if (sureClickListener != null) {
            layout.findViewById(R.id.sure).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    sureClickListener.onClick(view);
                    dialog.dismiss();
                }
            });
        }
        if (cancelClickListener != null) {
            layout.findViewById(R.id.cancel).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    cancelClickListener.onClick(view);
                    dialog.dismiss();
                }
            });
        }
        //设置宽度
        WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
        params.width = (int) (context.getResources().getDisplayMetrics().widthPixels * 0.80);
        dialog.getWindow().setAttributes(params);
        return dialog;
    }

    private void setText(CharSequence text, int id) {
        if (isValid(text)) {
            TextView textView = (TextView) layout.findViewById(id);
            textView.setText(text);
            textView.setVisibility(View.VISIBLE);
        }
    }

    private boolean isValid(CharSequence text) {
        return text != null && !"".equals(text.toString().trim());
    }
}

下面是custom_dialog_layout


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/white"
    android:orientation="vertical">

    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:ellipsize="end"
        android:gravity="center"
        android:maxLines="2"
        android:textColor="#38ADFF"
        android:textSize="16dp"
        android:visibility="gone" />


    <TextView
        android:id="@+id/message"
        android:padding="16dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="left"
        android:lineSpacingMultiplier="1.2"
        android:text="正文"
        android:textSize="14dp" />


    <View
        android:id="@+id/line2"
        android:layout_width="fill_parent"
        android:layout_height="0.5dp"
        android:background="#cccccc"
        android:visibility="gone" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/cancel"
            android:layout_width="0dp"
            android:layout_height="44dp"
            android:layout_weight="1.0"
            android:gravity="center"
            android:textColor="#666666"
            android:textSize="14dp"
            android:visibility="gone" />

        <View
            android:id="@+id/line"
            android:layout_width="0.5dp"
            android:layout_height="match_parent"
            android:background="#cccccc"
            android:visibility="gone" />

        <TextView
            android:id="@+id/sure"
            android:layout_width="0dp"
            android:layout_height="44dp"
            android:layout_weight="1.0"
            android:gravity="center"
            android:textColor="#38ADFF"
            android:textSize="14dp"
            android:visibility="gone" />

    LinearLayout>

style样式CustomDialog

    <style name="CustomDialog" parent="android:style/Theme.Dialog">
        
        "android:windowBackground">@android:color/transparent
        
        "android:windowNoTitle">true
        
        "android:windowFrame">@null
        
        "android:windowIsFloating">true
        
        "android:backgroundDimEnabled">true
    style>

主activity调用

 new DialogBuilder(MainActivity.this)
                .title("有标题的")
                .message("当两行时左对齐。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。")
                .sureText("我知道了")
                .setCancelable(false)
                .setSureOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        new DialogBuilder(MainActivity.this)
                                .title("有标题的")
                                .message("显示确定和取消两个")
                                .cancelText("确定")
                                .sureText("取消")
                                .setSureOnClickListener(new View.OnClickListener() {
                                    @Override
                                    public void onClick(View view) {
                                        new DialogBuilder(MainActivity.this)
                                                .title("有标题的")
                                                .message("当只有一行时居中")
                                                .build().show();
                                    }
                                }).build().show();
                    }
                }).build().show();

好了 ,就四部分代码。拷过去就能用了

你可能感兴趣的:(android)