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() {@Overridepublic 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() {@Overridepublic 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"?>                                                                                                                                                                    

实现效果


更多相关文章

  1. Android(安卓)UI开发之——使用Fragment构建灵活的桌面
  2. [置顶] 去掉listview的分割线和分割线的颜色,高度的设置
  3. android多屏设计、适配(来自官网)
  4. Android中实现自动生成布局View的初始化代码方法
  5. Android在网页下(WebView中运用HTML)点击按钮打开本地手机应用程
  6. Android布局文件
  7. Android(安卓)学习之那些年我们遇到的BUG4:Error:(46, 38) 错误:
  8. 懒骨头的Android文档备份3:一个简单的交互界面
  9. Android事件分发机制完全解析,带你从源码的角度彻底理解(下) 。

随机推荐

  1. Android学习笔记(14)————Socket在And
  2. Android学习笔记(16)————Android的XM
  3. Android中禁止Gridview上下滑动
  4. Android中GPRS 开关
  5. Android(安卓)2d物理引擎Box2d介绍
  6. Android(安卓)studio 通过wifi debug
  7. Android(安卓)手机录音功能实现
  8. android实现蘑菇街购物车动画效果
  9. Android(安卓)SDK 开发环境需求(软硬件)
  10. android跳转至权限设置界面