翻译自: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);
其实明白了原理就可以定义出自己想要的风格了,小伙伴们赶紧来试一试吧,按着这个顺序写就可以了,没有漏掉一句代码就不上传代码了.