翻譯自: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);
其實明白了原理就可以定義出自己想要的風格了,小夥伴們趕緊來試一試吧,按着這個順序寫就可以了,沒有漏掉一句代碼就不上傳代碼了.