1. 程式人生 > >自定義彈出AlertDialog彈出框

自定義彈出AlertDialog彈出框

翻譯自:http://m.blog.csdn.net/article/details?id=50416876

最近在做一個電商專案,需要有一鍵退出功能,但是系統的AlertDialog風格不符合要求,需要自定義一個,在網上扒了很久,終於找到了一個寫的清晰的,適合我這種小菜鳥看的,現在按著圓柱作者的敘述做了一遍,很簡單有效,同時也加入了自己想要的點選空白處不能讓對話方塊消失的設定,好了,廢話不多說,上效果圖,再次感謝原著作者.


1.上程式碼:這個佈局檔案是一個單獨的layout,但需要說明的是在這裡面設定的寬高並不會起作用,詳細介紹請看原博文,至於應該怎麼配置,後邊會介紹到.

  <TextView
        android:gravity="center"
        android:text="提示\n確定要退出登入嗎"
        android:layout_width="200dp"
        android:layout_height="40dp" />

    <LinearLayout
        android:layout_width="200dp"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/cancle"
            android:gravity="center"
            android:text="取消"
            android:layout_width="100dp"
            android:layout_height="20dp" />

        <TextView
            android:id="@+id/ok"
            android:gravity="center"
            android:text="確定"
            android:layout_width="100dp"
            android:layout_height="20dp" />
    </LinearLayout>


2.在values/styles.xml檔案中自定義如下style:
 <!--新增的彈出框風格,繼承自Theme.DialogTheme.Dialog-->
    <style name="MsgDialog" parent="@android:style/Theme.Dialog">
        <!--沒有邊框;沒有背景色;沒有標題;視窗浮動;沒有陰影 -->
        <item name="android:windowFrame">@null</item>
        <item name="android:windowBackground">@null</item>
        <item name="android:windowNoTitle">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>
3.自定義一個繼承自AlertDialog的類:
public class MsgDialog extends Dialog {

    private TextView positiveButton;
    private TextView negativeButton;

    public MsgDialog(Context context) {
        super(context);
        setMsgDialog();
    }

    private void setMsgDialog() {
        View mView = LayoutInflater.from(getContext()).inflate(R.layout.self_dialog, null);
        TextView title = (TextView) mView.findViewById(R.id.title);
        positiveButton = (TextView) mView.findViewById(R.id.ok);
        negativeButton = (TextView) mView.findViewById(R.id.cancle);
        if (positiveButton != null) positiveButton.setOnClickListener(listener);
        if (negativeButton != null) negativeButton.setOnClickListener(listener);
        super.setContentView(mView);
    }

    //點選之後消失
    private View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            MsgDialog.this.dismiss();
        }
    };

    /**
     * 確定鍵監聽器
     *
     * @param listener
     */
    public void setOnPositiveListener(View.OnClickListener listener) {
        positiveButton.setOnClickListener(listener);
    }

    /**
     * 取消鍵監聽器
     *
     * @param listener
     */
    public void setOnNegativeListener(View.OnClickListener listener) {
        negativeButton.setOnClickListener(listener);
    }


4.直接使用剛才自定的MsgDialog:
MsgDialog msgDialog = new MsgDialog(this);
        msgDialog.setOnNegativeListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "點選了取消", Toast.LENGTH_SHORT).show();
                msgDialog.dismiss();
            }
        });
        msgDialog.setOnPositiveListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "點選了確定", Toast.LENGTH_SHORT).show();
                msgDialog.dismiss();
            }
        });
        msgDialog.show();
    }



5:現在介紹上面所說的如何控制自定義alertdialog的寬高,在自定的類中加入如下程式碼,至於寬高自己可以根據需求指定:

 @Override
    public void show() {
        super.show();
        Window dialogWindow = this.getWindow();
        WindowManager.LayoutParams lp = dialogWindow.getAttributes();
        /////////獲取螢幕寬度
        DisplayMetrics dm = new DisplayMetrics();
        WindowManager wm = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE);;
        wm.getDefaultDisplay().getMetrics(dm);
        int screenWidth = dm.widthPixels;
        /////////設定高寬
        lp.width = (int) (screenWidth * 0.75); // 寬度
        lp.height = (int) (lp.width*0.65);     // 高度
        dialogWindow.setAttributes(lp);
    }

6.點選空白處對話方塊不消失的設定,一定要在show方法之前呼叫:
 //點選空白處不消失的方法
        msgDialog.setCanceledOnTouchOutside(false);

其實明白了原理就可以定義出自己想要的風格了,小夥伴們趕緊來試一試吧,按著這個順序寫就可以了,沒有漏掉一句程式碼就不上傳程式碼了.