1. 程式人生 > >自定義dialog簡單封裝

自定義dialog簡單封裝

安卓的dialog有很多種,什麼AlertDialog、ProgressDialog、TimePickerDialog等等。雖然谷歌似乎幫我們做了很多封裝,但實際應用時卻感覺很不好用,比如我不想要title。下面我們就來仿照AlertDialog對我們自定義的dialog進行封裝。沒有封裝的簡單自定義點這,封裝的好處我就不多說了。首先先看效果圖。
這裡寫圖片描述 這裡寫圖片描述

其次我們把程式碼直接貼出來!

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.sure).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

<?xml version="1.0" encoding="utf-8"?>
<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">
        <!--你的layout背景顏色及和透明程度-->
        <item name="android:windowBackground">@android:color/transparent</item>
        <!--是否去除標題 -->
        <item name="android:windowNoTitle">true</item>
        <!--是否去除邊框-->
        <item name="android:windowFrame">@null</item>
        <!--是否浮現在activity之上-->
        <item name="android:windowIsFloating">true</item>
        <!--螢幕其他地方是否模糊變黑-->
        <item name="android:backgroundDimEnabled">true</item>
    </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();

好了 ,就四部分程式碼。拷過去就能用了