自定義彈出AlertDialog彈出框
阿新 • • 發佈:2019-02-08
翻譯自: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>
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);
其實明白了原理就可以定義出自己想要的風格了,小夥伴們趕緊來試一試吧,按著這個順序寫就可以了,沒有漏掉一句程式碼就不上傳程式碼了.