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"?>
<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" ><LinearLayoutandroid: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" ><LinearLayoutandroid:id="@+id/topPanel"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical" ><LinearLayoutandroid: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" ><TextViewandroid: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><Viewandroid:id="@+id/titleDivider"android:layout_width="match_parent"android:layout_height="2dip"android:background="@android:color/holo_blue_light" /></LinearLayout><LinearLayoutandroid:id="@+id/contentPanel"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"android:minHeight="45dp"android:orientation="vertical" ><ScrollViewandroid:id="@+id/scrollView"android:layout_width="match_parent"android:layout_height="wrap_content"android:clipToPadding="false" ><TextViewandroid: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><LinearLayoutandroid: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" ><LinearLayoutstyle="?android:attr/buttonBarStyle"android:layout_width="match_parent"android:layout_height="wrap_content"android:measureWithLargestChild="true"android:orientation="horizontal" ><Buttonandroid: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" /><Buttonandroid: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>

实现效果

一步步实现 仿制Android LOL多玩盒子(四) 自定义AlertDialog实现相关推荐

  1. 一步步实现 仿制Android LOL多玩盒子(一) 概览

    一.起源 最近比较闲,玩LOL的时候感觉 Android LOL多玩盒子 里面应用到的东西挺多也挺有意思,打算仿照着做一个.抱着练练手的心态,打算只使用原APK中的图片,代码和布局均自己实现.由于该应 ...

  2. 一步步实现 仿制Android LOL多玩盒子(三) 英雄基础

    一.原应用模块简介 1,入口,主界面-英雄. 2,英雄列表模块中包含一个ViewPager的指示器,一个ViewPager.一共三页,免费.收藏.全部.都是每页的内容都包含一个GridView,全部页 ...

  3. [Android学习笔记四] 自定义Android组件之组合方式创建密码框组件

    Android中所有控件(也称组件)都继承自adnroid.view.View类,android.view.ViewGroup是View类的重要子类,绝大多书的布局类就继承自ViewGroup类. 参 ...

  4. 【转】android电池(四):电池 电量计(MAX17040)驱动分析篇

    关键词:android 电池  电量计  MAX17040 任务初始化宏 power_supply 平台信息: 内核:linux2.6/linux3.0 系统:android/android4.0  ...

  5. android java 多线程,Android多线程的四种方式

    当我们启动一个App的时候,Android系统会启动一个Linux Process,该Process包含一个Thread,称为UI Thread或Main Thread.通常一个应用的所有组件都运行在 ...

  6. 四、Android学习第四天——JAVA基础回顾(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 四.Android学习第四天--JAVA基础回顾 这才学习Android的 ...

  7. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (四) —— ContentProvider...

    ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制.一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制.并且此种方式忽略了底层的数据存储实现,Cont ...

  8. Android----Google code android开源项目(四)

    Google code android开源项目(四) 1.        sparserss http://code.google.com/p/sparserss/ 一个简洁的android rss阅 ...

  9. Android XML中引用自定义内部类view的四个why

    今天碰到了在XML中应用以内部类形式定义的自定义view,结果遇到了一些坑.虽然通过看了一些前辈写的文章解决了这个问题,但是我看到的几篇都没有完整说清楚why,于是决定做这个总结. 使用自定义内部类v ...

最新文章

  1. LINUX下用C语言历遍目录 C语言列出目录
  2. MySQL事务的读脏
  3. Access SQL中Left Join、Right Join和Inner Join的使用
  4. 史上最全的Linux常用——目录和文件管理命令——收藏这一篇就够了!(超全,超详细)
  5. SAP CRM呼叫中心polling javascript - icf_notify_poll.js
  6. JavaFX:TouchGesture内存泄漏?
  7. ASRT:一个中文语音识别系统
  8. 机器学习的几种主要学习方法
  9. 企业级多用户发卡平台源码 源码完全开源 无任何加密
  10. HtmlUnit实现人人网登陆
  11. V for vendetta
  12. maya中英文对照_maya2011中英文对照表
  13. Tik Tok跨境:不会英语可以做TikTok吗?
  14. 判断当前页面是否在微信内置浏览器中打开
  15. LinkedList面试要点总结
  16. geoserver给天地图添加服务,给线加标注
  17. xilinx基础篇Ⅰ(3)ISE14.7下载FPGA
  18. Hadoop分布式集群环境准备--无线网下VMware虚拟机设置
  19. 【vue面试题-路由】
  20. 浅谈百度谷歌蜘蛛机器人活动规律

热门文章

  1. 制表位的使用和多级列表的设置
  2. python字典之嵌套
  3. 寻找二叉树两个结点的最低共同父节点
  4. 程序员应该读的 7 本经典书籍
  5. CentOS7安装MySQL数据库、设置防火墙
  6. occt_modeling_data(一)——拓扑
  7. 最受欢迎的家居饰品-留声机
  8. 【github】常用Github项目类库
  9. FLIR相机项目属性配置lib文件备份
  10. 黑暗之魂(JZOJ)