android自带的AlertDialog格式比较单调,跟大多数应用的设计风格都不搭,能显示的内容也仅限于一些简单的文字、列表等。
AlertDialog的设计风格的调整一般有三种方式:1,在AlertDialog.Builder(context, theme)构造函数中传入自定义的主题,这种方式最便捷,但是可自定义的内容相当有限,只能改改字体颜色等,布局仍是固定的;2,使用 Builder.setView(layoutResId) 和 Builder.setCustomTitle(customTitleView) 两个方法改变内容区和标题区布局,底部的按钮可以通过改AlertDialog.Builder(context, theme)中的theme来做一些简单的定制,也可以在 Builder.setView 方法中设置的布局里面把按钮也放进去,然后定义监听事件;3,使用 AlertDialog.getWindow().setContentView(view); 方法来定制Dialog的布局,这种方法可以完全定制Dialog的所有东西;4,继承Dialog类,按照AlertDialog的格式重写一遍。
以上四种方法,个人比较喜欢第三种,实现简单又可完全达到目的。
下面是第三种方法的一个简单实现。暂时只支持显示提示消息,其他类型的弹框原理都跟这一样。
/**
* 消息提示框
* @author warren
* @date 2015年1月5日
*/
public class MessageDialog {
private DialogInterface.OnClickListener mListenerPostive;
private DialogInterface.OnClickListener mListenerNegative;
private AlertDialog mAlert;
private AlertDialog.Builder mBuilder;
private Context mContext;
private String mStrTitle;
private String mStrMessage;
private String mStrOk;
private String mStrCancel;
private ViewGroup mVRoot;
private LinearLayout mLlTitlePanel;
private LinearLayout mLlContentPanel;
private LinearLayout mLlButtonPanel;
private TextView mTvTitle;
private TextView mTvMessage;
private Button mBtnPositive;
private Button mBtnNegative;
public MessageDialog(Context context){
this.mContext = context;
mVRoot = (ViewGroup) LayoutInflater.from(this.mContext).inflate(R.layout.dlg_message, null);
mLlTitlePanel = (LinearLayout) this.mVRoot.findViewById(R.id.topPanel);
mLlContentPanel = (LinearLayout) this.mVRoot.findViewById(R.id.contentPanel);
mLlButtonPanel = (LinearLayout) this.mVRoot.findViewById(R.id.buttonPanel);
mTvTitle = (TextView) this.mVRoot.findViewById(R.id.alertTitle);
mTvMessage = (TextView) this.mVRoot.findViewById(R.id.message);
mBtnPositive = (Button) this.mVRoot.findViewById(R.id.button1);
mBtnNegative = (Button) this.mVRoot.findViewById(R.id.button2);
mBuilder = new AlertDialog.Builder(context);
}
/**
* 显示Dialog
* @return
*/
public MessageDialog show(){
// 没有设置标题就不显示标题区
if(this.mStrTitle == null){
mLlTitlePanel.setVisibility(View.GONE);
} else {
mTvTitle.setText(this.mStrTitle);
}
// 内容区无论如何都要显示
mTvMessage.setText(mStrMessage == null ? "" : mStrMessage);
if(this.mStrOk == null && this.mStrCancel == null){
mLlButtonPanel.setVisibility(View.GONE);
} else {
if(mStrOk != null){
mBtnPositive.setText(mStrOk);
mBtnPositive.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mListenerPostive != null){
mListenerPostive.onClick(mAlert, DialogInterface.BUTTON1);
mAlert.dismiss();
}
}
});
} else {
mBtnPositive.setVisibility(View.GONE);
}
if(mStrCancel != null){
mBtnNegative.setText(mStrCancel);
mBtnNegative.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mListenerNegative != null){
mListenerNegative.onClick(mAlert, DialogInterface.BUTTON2);
mAlert.dismiss();
}
}
});
} else {
mBtnNegative.setVisibility(View.GONE);
}
}
mAlert = mBuilder.show();
// 显示Dialog后才能使用 setContentView 设置内容视图,否则会报异常,因为Dialog只有在显示渲染之后才能获得其窗口。
mAlert.getWindow().setContentView(mVRoot);
return this;
}
/**
* 隐藏Dialog
*/
public void dismiss(){
if(mAlert != null && mAlert.isShowing()){
mAlert.dismiss();
}
}
/**
* 设置Dialog标题
* @param text
* @return
*/
public MessageDialog setTitle(String text){
this.mStrTitle = text;
return this;
}
/**
* 设置消息内容
* @param text
* @return
*/
public MessageDialog setMessage(String text){
this.mStrMessage = text;
return this;
}
/**
* 设置确定按钮
* @param text
* @param listener
* @return
*/
public MessageDialog setPositiveButton(String text, DialogInterface.OnClickListener listener){
mStrOk = text;
this.mListenerPostive = listener;
return this;
}
/**
* 设置取消按钮
* @param text
* @param listener
* @return
*/
public MessageDialog setNegativeButton(String text, DialogInterface.OnClickListener listener){
mStrCancel = text;
this.mListenerNegative = listener;
return this;
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/parentPanel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="8dip"
android:layout_marginStart="8dip"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="30dp"
android:layout_marginStart="30dp"
android:background="@color/dlg_background"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/topPanel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/title_template"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="16dip"
android:layout_marginStart="16dip"
android:gravity="center_vertical|start"
android:minHeight="45dp"
android:orientation="horizontal" >
<TextView
android:id="@+id/alertTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:singleLine="true"
android:text="提示"
android:textColor="@color/greenblue"
android:textSize="16sp" />
</LinearLayout>
<View
android:id="@+id/titleDivider"
android:layout_width="match_parent"
android:layout_height="2dip"
android:background="@android:color/holo_blue_light" />
</LinearLayout>
<LinearLayout
android:id="@+id/contentPanel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:minHeight="45dp"
android:orientation="vertical" >
<ScrollView
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false" >
<TextView
android:id="@+id/message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dip"
android:paddingEnd="16dip"
android:paddingStart="16dip"
android:paddingTop="8dip"
android:textColor="@android:color/white" />
</ScrollView>
</LinearLayout>
<LinearLayout
android:id="@+id/buttonPanel"
android:layout_width="match_parent"
android:layout_height="40dp"
android:divider="?android:attr/dividerHorizontal"
android:dividerPadding="0dip"
android:orientation="vertical"
android:showDividers="beginning" >
<LinearLayout
style="?android:attr/buttonBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:measureWithLargestChild="true"
android:orientation="horizontal" >
<Button
android:id="@+id/button2"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:layout_weight="1"
android:background="@drawable/bg_btn_dialog"
android:maxLines="2"
android:textColor="@android:color/white"
android:textSize="14sp" />
<Button
android:id="@+id/button1"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:layout_weight="1"
android:background="@drawable/bg_btn_dialog"
android:maxLines="2"
android:textColor="@android:color/white"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
实现效果