在进行android项目中需要用到对话框,但是由于系统自带的对话框样式不能很好的和你的项目融合,于是就需要用到自定义对话框了。自定义对话框能提高应用的档次。效果图如下:

具体怎么实现我不细说了,直接把源码粘贴出来。源码如下:
my_dialog.xml布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" https://schemas.android.com/apk/res/android " android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:minWidth="280dip" android:background="#FFFFFFFF"> <TextView android:id="@+id/dialog_title" android:layout_width="fill_parent" android:layout_height="40.0dip" android:gravity="center_vertical" android:paddingLeft="10.0dip" android:text="@string/dialog_title" android:textSize="20dip" android:textStyle="bold" android:textColor="#0087CB"/> <ImageView android:layout_height="wrap_content" android:layout_width="fill_parent" android:background="@drawable/dialog_sparator"/> <LinearLayout android:id="@+id/dialog_content" android:orientation="vertical" android:layout_height="wrap_content" android:layout_width="fill_parent"> <TextView android:id="@+id/dialog_message" android:layout_width="fill_parent" android:layout_height="50.0dip" android:gravity="center_vertical" android:paddingLeft="10dip" android:text="@string/dialog_msg" android:textSize="20dip" android:textStyle="bold" android:textColor="#707070"/> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="50.0dip" android:layout_alignParentTop="true" android:gravity="center"> <Button android:id="@+id/dialog_back" android:layout_width="120dip" android:layout_height="wrap_content" android:layout_marginRight="5dip" android:text="@string/dialog_back" android:textSize="20dip" android:textColor="#ffffff" android:textStyle="bold" android:background="@drawable/dlg_bckbtn_selector"/> <Button android:id="@+id/dialog_confirm" android:layout_width="120dip" android:layout_height="wrap_content" android:layout_marginLeft="5dip" android:text="@string/dialog_exit" android:textSize="20dip" android:textColor="#ffffff" android:textStyle="bold" android:background="@drawable/dlg_cfgrmbtn_selector"/> </LinearLayout> </LinearLayout>
定义Dialog的样式(主题):
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- 定义对话框样式 --> <style name="Dialog" parent="android:style/Theme.Dialog"> <item name="android:windowBackground">@null</item> <item name="android:windowNoTitle">true</item> <item name="android:windowIsFloating">true</item> </style> </resources>
自定义Dialog的Java代码:
Java代码
package com.book;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MyDialog extends Dialog {
public MyDialog(Context context, int theme) {
super(context, theme);
}
public MyDialog(Context context) {
super(context);
}
/**
* Helper class for creating a custom dialog
*/
public static class Builder {
private Context context;
private String title; // 对话框标题
private String message; // 对话框内容
private String backButtonText; // 对话框返回按钮文本
private String confirmButtonText; // 对话框确定文本
private View contentView;
// 对话框按钮监听事件
private DialogInterface.OnClickListener
backButtonClickListener,
confirmButtonClickListener;
public Builder(Context context) {
this.context = context;
}
/**
* 使用字符串设置对话框消息
* @param title
* @return
*/
public Builder setMessage(String message) {
this.message = message;
return this;
}
/**
* 使用资源设置对话框消息
* @param title
* @return
*/
public Builder setMessage(int message) {
this.message = (String) context.getText(message);
return this;
}
/**
* 使用资源设置对话框标题信息
* @param title
* @return
*/
public Builder setTitle(int title) {
this.title = (String) context.getText(title);
return this;
}
/**
* 使用字符串设置对话框标题信息
* @param title
* @return
*/
public Builder setTitle(String title) {
this.title = title;
return this;
}
/**
* 设置自定义的对话框内容
* @param v
* @return
*/
public Builder setContentView(View v) {
this.contentView = v;
return this;
}
/**
* 设置back按钮的事件和文本
* @param backButtonText
* @param listener
* @return
*/
public Builder setBackButton(int backButtonText, DialogInterface.OnClickListener listener) {
this.backButtonText = (String)context.getText(backButtonText);
this.backButtonClickListener = listener;
return this;
}
/**
* 设置back按钮的事件和文本
* @param backButtonText
* @param listener
* @return
*/
public Builder setBackButton(String backButtonText, DialogInterface.OnClickListener listener) {
this.backButtonText = backButtonText;
this.backButtonClickListener = listener;
return this;
}
/**
* 设置确定按钮事件和文本
* @param confirmButtonText
* @param listener
* @return
*/
public Builder setConfirmButton(int confirmButtonText, DialogInterface.OnClickListener listener) {
this.confirmButtonText = (String)context.getText(confirmButtonText);
this.confirmButtonClickListener = listener;
return this;
}
/**
* 设置确定按钮事件和文本
* @param negativeButtonText
* @param listener
* @return
*/
public Builder setConfirmButton(String confirmButtonText, DialogInterface.OnClickListener listener) {
this.confirmButtonText = confirmButtonText;
this.confirmButtonClickListener = listener;
return this;
}
/**
* 创建自定义的对话框
*/
public MyDialog create() {
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// 实例化自定义的对话框主题
final MyDialog dialog = new MyDialog(context, R.style.Dialog);
View layout = inflater.inflate(R.layout.my_dialog, null);
dialog.addContentView(layout,
new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
// 设置对话框标题
((TextView) layout.findViewById(R.id.dialog_title)).setText(title);
// 设置对话框内容
if (message != null) {
TextView dlgMsg = (TextView)layout.findViewById(R.id.dialog_message);
dlgMsg.setText(message);
} else if (contentView != null) {
// if no message set
// 如果没有设置对话框内容,添加contentView到对话框主体
((LinearLayout) layout.findViewById(R.id.dialog_content)).removeAllViews();
((LinearLayout) layout.findViewById(R.id.dialog_content)).addView(
contentView, new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
}
// 设置返回按钮事件和文本
if (backButtonText != null) {
Button bckButton = ((Button) layout.findViewById(R.id.dialog_back));
bckButton.setText(backButtonText);
if (backButtonClickListener != null) {
bckButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
backButtonClickListener.onClick(dialog, DialogInterface.BUTTON_NEGATIVE);
}
});
}
} else {
layout.findViewById(R.id.dialog_back).setVisibility(View.GONE);
}
// 设置确定按钮事件和文本
if (confirmButtonText != null) {
Button cfmButton = ((Button) layout.findViewById(R.id.dialog_confirm));
cfmButton.setText(confirmButtonText);
if (confirmButtonClickListener != null) {
cfmButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
confirmButtonClickListener.onClick(dialog, DialogInterface.BUTTON_POSITIVE);
}
});
}
} else {
layout.findViewById(R.id.dialog_confirm).setVisibility(View.GONE);
}
dialog.setContentView(layout);
return dialog;
}
}
} 使用自定义的Dialog:
@Override
protected Dialog onCreateDialog(int id) {
Dialog dialog = null;
switch (id) {
case DIALOG_EXIT:
MyDialog.Builder myBuilder = new MyDialog.Builder(MainActivity.this);
myBuilder.setTitle("温馨提示");
myBuilder.setMessage("您确定退出吗?");
myBuilder.setBackButton("返 回", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// 关闭对话框
dismissDialog(DIALOG_EXIT);
}
});
myBuilder.setConfirmButton("确 定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// 退出电子书
finish();
}
});
dialog = myBuilder.create();
break;
}
return dialog;
} 当点击返回菜单时显示对话框:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// 监听主菜单返回事件
if (keyCode == KeyEvent.KEYCODE_BACK) {
showDialog(DIALOG_EXIT);
return false;
}
return super.onKeyDown(keyCode, event);
}