在开发中经常会用到AlertDialog,但是Android自带的AlertDialog太丑啦,不如自定义一个AlertDialog
思路:一般的AlertDialog一般包括标题 内容栏 确定按钮和取消按钮;好,在UI总布局中,设置一线性布局,从上到下依次包括TextView TextView LinearLayout,依次显示标题、内容和确定取消按钮(其中LinearLayout中包含两个按钮)。
只需要调整总布局的背景、圆角、以及子布局的VISIBILITY即可。
1、没有调整前的Dialog的样子:
2、自定义AlertDialog 实现对上述布局的控制,以及业务代码的处理
上述布局代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/alert_bg"
android:orientation="vertical">
<TextView
android:id="@+id/txt_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="15dp"
android:layout_marginRight="15dp"
android:gravity="center"
android:textColor="@color/black"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:id="@+id/txt_msg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="15dp"
android:layout_marginRight="15dp"
android:gravity="center"
android:textColor="@color/black"
android:textSize="16sp" />
<ImageView
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:layout_marginTop="10dp"
android:background="@color/alertdialog_line" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_neg"
android:layout_width="wrap_content"
android:layout_height="43dp"
android:layout_weight="1"
android:background="@drawable/alertdialog_left_selector"
android:gravity="center"
android:textColor="@color/actionsheet_blue"
android:textSize="16sp" />
<ImageView
android:id="@+id/img_line"
android:layout_width="0.5dp"
android:layout_height="43dp"
android:background="@color/alertdialog_line" />
<Button
android:id="@+id/btn_pos"
android:layout_width="wrap_content"
android:layout_height="43dp"
android:layout_weight="1"
android:background="@drawable/alertdialog_right_selector"
android:gravity="center"
android:textColor="@color/actionsheet_blue"
android:textSize="16sp"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>
3、代码中用到的selector
alertDialog_single_selector.xml
<item android:drawable="@drawable/alert_btn_single_pressed" android:state_pressed="true"/>
<item android:drawable="@drawable/trans_bg"/>
alertDialog_right_selector.xml
<item android:drawable="@drawable/alert_btn_right_pressed" android:state_pressed="true"/>
<item android:drawable="@drawable/trans_bg"/>
4、先写自定义AlertDialog的用法随后附上源码分析吧
private void showDialog(){
new AlertDialog(MainActivity.this).init()
.setTitle("通知")
.setMsg("你现在无法接收到新消息提醒。请到系统中去设置")
.setCancelable(fasle)
.setNegativeButton("确定",new View.OnClickListener(){
@Override
public void onClick(View v){
}
}).show();
效果图如下:
5、重点来了,现在要分析AlertDialog的代码,看它如何实现的
public class AlertDialog{
private LinearLayout container;
private Display display;
private boolean showTitle=false;//默认这些布局加载时不显示,需要在代码中定义
private boolean showMsg=false;
private boolean showPosBtn=false;
private boolean showNegBtn=false;
public AlertDialog(Context context){
this.context=context;
WindowManager windowManager=(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
display=windowManager.getDefaultDisplay();//display用于获取屏幕的宽和高
}
public AlertDialog init(){
//获取Dialog的布局(背景)
View view=LayoutInflater.from(context).inflate(R.layout.view_alertdialog,null);
//获取自定义Dialog布局中的控件(默认都不显示)
container = (LinearLayout) view.findViewById(R.id.container);
titleTv = (TextView) view.findViewById(R.id.txt_title);
titleTv.setVisibility(View.GONE);
msgTv = (TextView) view.findViewById(R.id.txt_msg);
msgTv.setVisibility(View.GONE);
negBtn = (Button) view.findViewById(R.id.btn_neg);
negBtn.setVisibility(View.GONE);
posBtn = (Button) view.findViewById(R.id.btn_pos);
posBtn.setVisibility(View.GONE);
img_line = (ImageView) view.findViewById(R.id.img_line);
img_line.setVisibility(View.GONE);
//定义Dialog的布局和参数
dialog=new Dialog(context,R.style.DialogStyle);
dialog.setContentView(view);//dialog加载布局
//调整dialog的背景大小
container.setLayoutParams(
new FrameLayout.LayoutParams(
(int)(display.getWidth()*0.5),
LinnearLayout.LayoutParams.WRAP_CONTENT));//dialog宽:屏幕的0.85倍 高:包裹内容
return this;
}
public AlertDialog setTitle(String title){
showTitle=true;
if("".equals(title)){
titleTv.setText("标题");
}else{
titleTv.setText(title);
}
return this;
}
public AlertDialog setMsg(String msg){
showMsg=true;
if("".equals(msg)){
msgTv.setText("内容");
}else{
msgTv.setText(msg);
}
return this;
}
public AlertDialog setCancelable(boolean cancel){
dialog.setCancelable(cancel);
return this;
}
public AlertDialog setPositiveButton(String txt,final View.OnClickListener listener){
showPosBtn=true;
if("".equals(txt)){
posBtn.setText("确定");
}else{
posBtn.setText(txt);
}
posBtn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
listener.onClick(v);
dialog.dismiss();
}
});
return this;
}
public AlertDialog setNegativeButton(String text, final View.OnClickListener listener) {
showNegBtn = true;
if ("".equals(text)) {
negBtn.setText("取消");
} else {
negBtn.setText(text);
}
negBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onClick(v);
dialog.dismiss();
}
});
return this;
}
private void setLayout(){
if(!showTitle && !){
titleTv.setText("提示");
titleTv.setVisibility(View.VISIBLE);
}
if(showTitle){
titleTv.setVisibility(View.VISIBLE);
}
if(showMsg){
msgTv.setVisibility(View.VISIBLE);
}
if(!showPosBtn && !showNegBtn){
posBtn.setText("确定");
posBtn.setVisibility(View.VISIBLE);
posBtn.setBackgroundResource(R.drawable.alertdialog_single_selector);
posBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
}
if(showPosBtn && showMegBtn){
posBtn.setVisibility(View.VISIBLE);
posBtn.setBackGroundResource(R.drawable.alertdialog_right_selector);
negBtn.setVisibility(View.VISIBLE);
negBtn.setBackGroundResource(R.drawable.alertDialog_left_selector);
image_line.setVisibility(View.VISIBLE);//确定与取消按钮之间的竖线 显示
}
if (showPosBtn && !showNegBtn) {//只显示确定按钮,并且占满全行
posBtn.setVisibility(View.VISIBLE);
posBtn.setBackgroundResource(R.drawable.alertdialog_single_selector);
}
if (!showPosBtn && showNegBtn) {//只显示取消按钮,并且占满全行
negBtn.setVisibility(View.VISIBLE);
negBtn.setBackgroundResource(R.drawable.alertdialog_single_selector);
}
}
public void show(){//dialog的显示
setLayout();
dialog.show();
}