Android UI开发:AlertDialog对话框
一、前言
在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对话框相关推荐
- 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 布局的创 ...
- Android UI开发第二十五篇——分享一篇自定义的 Action Bar
Action Bar是android3.0以后才引入的,主要是替代3.0以前的menu和tittle bar.在3.0之前是不能使用Action Bar功能的.这里引入了自定义的Action Bar, ...
- Android UI开发第三十篇——使用Fragment构建灵活的桌面
http://www.lupaworld.com/article-222973-1.html 当我们设计应用程序时,希望能够尽最大限度的适配各种设备,包括4寸屏.7寸屏. 10寸屏等等,Android ...
- Android UI开发第四十一篇——墨迹天气3.0引导界面及动画实现
周末升级了墨迹天气,看着引导界面做的不错,模仿一下,可能与原作者的代码实现不一样,但是实现的效果还是差不多的.先分享一篇以前的文章,android动画的基础知识,<Android UI开发第十二 ...
- Android UI开发第三十九篇——Tab界面实现汇总及比较
Tab布局是iOS的经典布局,Android应用中也有大量应用,前面也写过Android中TAb的实现,<Android UI开发第十八篇--ActivityGroup实现tab功能>.这 ...
- 【Android -- UI开发】一份 UI 开发学习指南
思维导图 推荐资料:官方文档 六大布局 网上有人比喻的很好:布局好比是建筑里的框架,组件按照布局的要求依次排列,就组成了用于看见的漂亮界面了. 请看文章:[Android – UI 开发]六大布局 U ...
- Android UI开发——AppCompat实现Action Bar
http://blog.csdn.net/xyz_lmn/article/details/12623609 每一位Android开发者对Action Bar这种设计都不陌生了,毕竟它已经发布了至少两年 ...
- Android UI开发第四篇——实现像handcent sms或者chomp sms那样的气泡短信样式
今晚有点时间把断了很长时间的UI开发补一下,这次实现的是像handcent sms或者chomp sms那样的气泡短信样式,也是iphone上的气泡聊天模式.实现这种效果的重点是ListView的di ...
- 【Android -- UI 开发】Spinner 的基本使用
前言 本节开始学习 Spinner 的基本用法. 属性 android:dropDownHorizontalOffset:设置列表框的水平偏移距离 android:dropDownVerticalOf ...
- Android UI开发——Material Design界面设计【详细】
转自:http://colachan.com/post/3416 找了很多Material Design的资料,终于找到一篇比较靠谱的.能看懂的,我认为非常有用的学习资料,就像他们说的,只要你按Mat ...
最新文章
- 10年,4600万台!树莓派,生日快乐
- C++_模板特化(specialization),模板偏特化(局部特化)(partial specialization)
- Normalization在CTR问题中的迷之效果
- 一文搞定Vim/Vi编辑器
- tabBar颜色改动
- 不是说好一起长大的吗?
- centos7.4下安装配置PHP服务(源码安装)并配置nginx支持php
- Spring Framework 源码解析课程大纲
- 清理linux清理垃圾文件夹,让Ubuntu系统释放空间最有效的五种方法(清除不需要的或垃圾文件)...
- C语言中数字转换成字符,c语言中数字转换成字符串的方法
- RedHat Linux各版本汇总
- STM8L低功耗模式
- 苹果11相机权限开启不了_iOS11 访问相册、相机权限,居然变化了,巨坑啊........
- nginx反向代理 负载均衡
- iOS生成gif图片
- 爬虫爬取实时新闻标题、时间及新闻内容并保存
- 前端模拟自动解析手机号姓名地址
- O-RAN,真的会成功吗?[转载]
- 可编程控制器/微机接口及微机应用综合装置
- c语言随机产生100个字母,C语言实现生成1到100随机数的方法
热门文章
- 伯克利大学计算机作业答案,W 同学_加州大学伯克利分校_计算机_录取成功案例分享...
- 中国天气预报API城市编号
- 约瑟夫环数学问题——举一反三、触类旁通
- 前端实现导入(excel文件)导出(word)文件
- 服务器运维故障处理案例
- 全球与中国人工智能翻译服务市场现状及未来发展趋势
- Wireshark流量分析
- 一个意外错误使你无法删除该文件,文件或目录损坏且无法读取
- 微信公众号如何申请原创声明功能
- 怎么查询网站最近的cdn服务器,如何查看网站是否cdn加速