一、前言

在Android UI开发中我们经常遇到Dialog,比如确认是否退出APP界面。

二、原生的Dialog

1.默认样式

AlertDialog.Builder builder = new AlertDialog.Builder(AlertDialogActivity.this);
builder.setTitle("请回答");
builder.setMessage("你觉得我好看吗??");
builder.setPositiveButton("当然是好看了!!", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(AlertDialogActivity.this, "嘻嘻嘻",Toast.LENGTH_SHORT).show();}
});
builder.setNeutralButton("我觉得一般", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(AlertDialogActivity.this,"那你再瞅瞅~",Toast.LENGTH_SHORT).show();}
});
builder.setNegativeButton("我觉得不好看", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(AlertDialogActivity.this,"嘤嘤嘤",Toast.LENGTH_SHORT).show();}
});
builder.show();

2.单选弹出框

final String[] gender = new String[]{"帅哥","美女"};
AlertDialog.Builder builder1=new AlertDialog.Builder(AlertDialogActivity.this);
builder1.setTitle("请选择你的性别");
builder1.setItems(gender, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {ToastUtil.showMsg(AlertDialogActivity.this,gender[which]);}
});
builder1.show();

3.单选列表弹出框

AlertDialog.Builder builder2=new AlertDialog.Builder(AlertDialogActivity.this);
builder2.setTitle("你最喜欢吃一下那种菜肴:");
final String[] dish =new String[]{"红烧牛肉","粉蒸排骨","油焖大虾","蒜蓉扇贝"};
builder2.setSingleChoiceItems(dish, 1, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {ToastUtil.showMsg(AlertDialogActivity.this,dish[which]);dialog.dismiss();}
});
builder2.setCancelable(false);
builder2.show();

4.多选列表弹出框

String[] dessert = new String[]{"抹茶千层","芒果拿破仑","草莓雪媚娘","蓝莓慕斯"};
boolean[] begin = new boolean[]{false,false,false,false};
AlertDialog.Builder builder3=new AlertDialog.Builder(AlertDialogActivity.this);
builder3.setTitle("你吃过以下哪些甜点");
builder3.setMultiChoiceItems(dessert, begin, new DialogInterface.OnMultiChoiceClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which, boolean isChecked) {}
});
builder3.setPositiveButton("确认", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {ToastUtil.showMsg(AlertDialogActivity.this,"好的,我知道啦!");}
});
builder3.setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {ToastUtil.showMsg(AlertDialogActivity.this,"难道你都没有吃过??");}
});
builder3.show();

5.补充

Android4.0以上AlertDialog在触摸对话框边缘外部,对话框消失可以设置这么一条属性,当然必须先AlertDialog.Builder.create()之后才能调用这两个方法
方法一:
setCanceledOnTouchOutside(false);调用这个方法时,按对话框以外的地方不起作用。按返回键还起作用
方法二:
setCancelable(false);调用这个方法时,按对话框以外的地方不起作用。按返回键也不起作用

三、自定义Dialog

原生Dialog的界面往往达不到我们开发的要求,所以需要自定义Dialog。
这种方式存在一个问题:如果是在手机息屏的时候弹出这个Dialog,再次打开屏幕的时候看不到Dialog,并且整个界面会变暗,界面交互失效。目前没有找到问题所在。而下面的自定义AlertDialog没有存在这个问题。

1.自定义Dialog界面的xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"><LinearLayoutandroid:layout_width="300dp"android:layout_height="wrap_content"android:background="@drawable/dialog_bg"android:gravity="center_horizontal"android:orientation="vertical"><TextViewandroid:id="@+id/tv_delete_dialog_title"android:layout_width="match_parent"android:layout_height="65dp"android:gravity="center"android:text="确认退出?"android:textColor="#FF0F58A3"android:textSize="21sp" /><TextViewandroid:id="@+id/tv_delete_dialog_content"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:textSize="@dimen/textsize_default" /><Viewandroid:layout_width="match_parent"android:layout_height="1px"android:background="#AAAAAA" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="52dp"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_delete_dialog_cancel"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="取消"android:textColor="#FF999999"android:textSize="18sp" /><Viewandroid:layout_width="1px"android:layout_height="match_parent"android:background="#AAAAAA" /><TextViewandroid:id="@+id/tv_delete_dialog_agree"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="确定"android:textColor="#FF0F58A3"android:textSize="18sp" /></LinearLayout></LinearLayout>
</LinearLayout>

2.自定义Dialog需要继承Dialog

public class DeleteDialog extends Dialog {private String title;private String content;private String buttonConfirm;private String buttonCancel;private View.OnClickListener confirmClickListener;private View.OnClickListener cancelClickListener;public DeleteDialog(Context context, String title, View.OnClickListener confirmClickListener) {super(context, R.style.Dialog);this.title = title;this.confirmClickListener = confirmClickListener;}public DeleteDialog(Context context, String title, String content, View.OnClickListener confirmClickListener) {super(context, R.style.Dialog);this.title = title;this.content = content;this.confirmClickListener = confirmClickListener;}public DeleteDialog(Context context, String content, View.OnClickListener cancelClickListener,View.OnClickListener confirmClickListener) {super(context, R.style.Dialog);this.title = title;this.cancelClickListener = cancelClickListener;this.confirmClickListener = confirmClickListener;}public DeleteDialog(Context context, String title, String content,View.OnClickListener cancelClickListener,View.OnClickListener confirmClickListener,String buttonCancel, String buttonConfirm) {super(context, R.style.Dialog);this.title = title;this.content = content;this.buttonConfirm = buttonConfirm;this.buttonCancel = buttonCancel;this.confirmClickListener = confirmClickListener;this.cancelClickListener = cancelClickListener;}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.dialog_layout_delete);TextView dialogTitle = findViewById(R.id.tv_delete_dialog_title);TextView dialogContent = findViewById(R.id.tv_delete_dialog_content);TextView dialogConfirm = findViewById(R.id.tv_delete_dialog_agree);TextView dialogCancel = findViewById(R.id.tv_delete_dialog_cancel);if (!TextUtils.isEmpty(title)) {dialogTitle.setText(title);}if (!TextUtils.isEmpty(content)) {dialogContent.setText(content);dialogContent.setVisibility(View.VISIBLE);} else {dialogContent.setVisibility(View.INVISIBLE);}if (!TextUtils.isEmpty(buttonConfirm)) {dialogConfirm.setText(buttonConfirm);}if (!TextUtils.isEmpty(buttonCancel)) {dialogCancel.setText(buttonCancel);}if (null != confirmClickListener) {dialogConfirm.setOnClickListener(confirmClickListener);}if (null != cancelClickListener) {dialogCancel.setOnClickListener(cancelClickListener);} else {dialogCancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {DeleteDialog.this.dismiss();}});}}public void setCanotBackPress() {this.setOnKeyListener(new OnKeyListener() {@Overridepublic boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {return keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP;}});}
}

3.styles.xml

    <!--自定义耗时对话框--><style name="CustomProgressDialog" parent="Theme.AppCompat.Dialog"><!--此属性控制悬浮窗背景是否变暗--><item name="android:backgroundDimEnabled">true</item><!-- windowIsTranslucent 窗口是否透明显示--><item name="android:windowIsTranslucent">true</item><!-- windowBackground 窗口背景设置--><item name="android:windowBackground">@android:color/transparent</item><!-- 是否悬浮在窗口上--><item name="android:windowIsFloating">true</item><!-- 是否设置边框--><item name="android:windowFrame">@null</item></style>

4.在MainActivity中调用自定义的Dialog

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);DeleteDialog mDialog = new DeleteDialog(this, "确认退出?", new View.OnClickListener(){@Overridepublic void onClick(View v) {mDialog.dismiss();//点击确定后的操作}});mDialog.show();}
}

四、自定义AlertDialog

1.自定义Dialog界面的xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"><LinearLayoutandroid:layout_width="300dp"android:layout_height="wrap_content"android:background="@drawable/dialog_bg"android:gravity="center_horizontal"android:orientation="vertical"><TextViewandroid:id="@+id/tv_delete_dialog_title"android:layout_width="match_parent"android:layout_height="65dp"android:gravity="center"android:text="确认退出?"android:textColor="#FF0F58A3"android:textSize="21sp" /><TextViewandroid:id="@+id/tv_delete_dialog_content"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:textSize="@dimen/textsize_default" /><Viewandroid:layout_width="match_parent"android:layout_height="1px"android:background="#AAAAAA" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="52dp"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_delete_dialog_cancel"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="取消"android:textColor="#FF999999"android:textSize="18sp" /><Viewandroid:layout_width="1px"android:layout_height="match_parent"android:background="#AAAAAA" /><TextViewandroid:id="@+id/tv_delete_dialog_agree"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="确定"android:textColor="#FF0F58A3"android:textSize="18sp" /></LinearLayout></LinearLayout>
</LinearLayout>

2.创建AlertDialog

        AlertDialog.Builder Dialog = new AlertDialog.Builder(MainActivity.this);LayoutInflater inflater = LayoutInflater.from(MainActivity.this);View view = inflater.inflate(R.layout.dialog_layout_delete, null);TextView dialogTitle = view.findViewById(R.id.tv_delete_dialog_title);TextView dialogContent = view.findViewById(R.id.tv_delete_dialog_content);TextView dialogConfirm = view.findViewById(R.id.tv_delete_dialog_agree);TextView dialogCancel = view.findViewById(R.id.tv_delete_dialog_cancel);Dialog.setView(view);Dialog.setCancelable(true);AlertDialog alertDialog = Dialog.create();alertDialog.show();dialogCancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {alertDialog.dismiss();}});

Android UI开发:AlertDialog对话框相关推荐

  1. Android 开发 -- 开发第一个安卓程序、Android UI开发(布局的创建:相对布局和线性布局、控件单位:px pt dp sp、常用控件 、常见对话框、ListView)

    文章目录 1. 开发第一个Hello World程序 1.1 开发程序 1.2 认识程序中的文件 1.3 Android程序结构 1.4 安卓程序打包 2. Android UI开发 2.1 布局的创 ...

  2. Android UI开发第二十五篇——分享一篇自定义的 Action Bar

    Action Bar是android3.0以后才引入的,主要是替代3.0以前的menu和tittle bar.在3.0之前是不能使用Action Bar功能的.这里引入了自定义的Action Bar, ...

  3. Android UI开发第三十篇——使用Fragment构建灵活的桌面

    http://www.lupaworld.com/article-222973-1.html 当我们设计应用程序时,希望能够尽最大限度的适配各种设备,包括4寸屏.7寸屏. 10寸屏等等,Android ...

  4. Android UI开发第四十一篇——墨迹天气3.0引导界面及动画实现

    周末升级了墨迹天气,看着引导界面做的不错,模仿一下,可能与原作者的代码实现不一样,但是实现的效果还是差不多的.先分享一篇以前的文章,android动画的基础知识,<Android UI开发第十二 ...

  5. Android UI开发第三十九篇——Tab界面实现汇总及比较

    Tab布局是iOS的经典布局,Android应用中也有大量应用,前面也写过Android中TAb的实现,<Android UI开发第十八篇--ActivityGroup实现tab功能>.这 ...

  6. 【Android -- UI开发】一份 UI 开发学习指南

    思维导图 推荐资料:官方文档 六大布局 网上有人比喻的很好:布局好比是建筑里的框架,组件按照布局的要求依次排列,就组成了用于看见的漂亮界面了. 请看文章:[Android – UI 开发]六大布局 U ...

  7. Android UI开发——AppCompat实现Action Bar

    http://blog.csdn.net/xyz_lmn/article/details/12623609 每一位Android开发者对Action Bar这种设计都不陌生了,毕竟它已经发布了至少两年 ...

  8. Android UI开发第四篇——实现像handcent sms或者chomp sms那样的气泡短信样式

    今晚有点时间把断了很长时间的UI开发补一下,这次实现的是像handcent sms或者chomp sms那样的气泡短信样式,也是iphone上的气泡聊天模式.实现这种效果的重点是ListView的di ...

  9. 【Android -- UI 开发】Spinner 的基本使用

    前言 本节开始学习 Spinner 的基本用法. 属性 android:dropDownHorizontalOffset:设置列表框的水平偏移距离 android:dropDownVerticalOf ...

  10. Android UI开发——Material Design界面设计【详细】

    转自:http://colachan.com/post/3416 找了很多Material Design的资料,终于找到一篇比较靠谱的.能看懂的,我认为非常有用的学习资料,就像他们说的,只要你按Mat ...

最新文章

  1. 10年,4600万台!树莓派,生日快乐
  2. C++_模板特化(specialization),模板偏特化(局部特化)(partial specialization)
  3. Normalization在CTR问题中的迷之效果
  4. 一文搞定Vim/Vi编辑器
  5. tabBar颜色改动
  6. 不是说好一起长大的吗?
  7. centos7.4下安装配置PHP服务(源码安装)并配置nginx支持php
  8. Spring Framework 源码解析课程大纲
  9. 清理linux清理垃圾文件夹,让Ubuntu系统释放空间最有效的五种方法(清除不需要的或垃圾文件)...
  10. C语言中数字转换成字符,c语言中数字转换成字符串的方法
  11. RedHat Linux各版本汇总
  12. STM8L低功耗模式
  13. 苹果11相机权限开启不了_iOS11 访问相册、相机权限,居然变化了,巨坑啊........
  14. nginx反向代理 负载均衡
  15. iOS生成gif图片
  16. 爬虫爬取实时新闻标题、时间及新闻内容并保存
  17. 前端模拟自动解析手机号姓名地址
  18. O-RAN,真的会成功吗?[转载]
  19. 可编程控制器/微机接口及微机应用综合装置
  20. c语言随机产生100个字母,C语言实现生成1到100随机数的方法

热门文章

  1. 伯克利大学计算机作业答案,W 同学_加州大学伯克利分校_计算机_录取成功案例分享...
  2. 中国天气预报API城市编号
  3. 约瑟夫环数学问题——举一反三、触类旁通
  4. 前端实现导入(excel文件)导出(word)文件
  5. 服务器运维故障处理案例
  6. 全球与中国人工智能翻译服务市场现状及未来发展趋势
  7. Wireshark流量分析
  8. 一个意外错误使你无法删除该文件,文件或目录损坏且无法读取
  9. 微信公众号如何申请原创声明功能
  10. 怎么查询网站最近的cdn服务器,如何查看网站是否cdn加速