在实际应用开发中,用到系统对话框中的情况几乎是没有的。按开发流程来说,UI工程师都会给出每一个弹窗的样式,故而在实际开发中都是自定义弹窗的。 即使用到的地方不多,但是我们也是需要了解并且能熟练的运用它,下面为大家奉上各种系统对话框的实现。

目录

系统对话框的几种类型与实现

在项目的实际开发中,用到的系统对话框几乎是没有的。原因大概包含以下几点:

  • 样式过于单一,不能满足大部分实际项目中的需求。
  • 对话框的样式会根据手机系统版本的不同而变化。不能达到统一的样式。
  • 能实现的功能过于简单。

在这里先附上下面代码中出现文本的string.xml文件。

<string name="dialog_normal_content">我是普通dialog</string>
<string name="dialog_normal_more_button_content">我是普通多按钮dialog</string>
<string name="dialog_btn_confirm_text">确定</string>
<string name="dialog_btn_cancel_text">取消</string>
<string name="dialog_btn_neutral_text">忽略</string>
<string name="dialog_btn_confirm_hint_text">您点击了确定按钮</string>
<string name="dialog_btn_cancel_hint_text">您点击了取消按钮</string>
<string name="dialog_btn_neutral_hint_text">您点击了忽略按钮</string>
复制代码

1、普通对话框

在实际项目开发中,此类型对话框中用到的地方要比其他类型的对话框多一些。但是考虑UI统一问题,也会很少用。

运行截图:

代码:

  private void showNormalDialog(){//创建dialog构造器AlertDialog.Builder normalDialog = new AlertDialog.Builder(this);//设置titlenormalDialog.setTitle(getString(R.string.dialog_normal_text));//设置iconnormalDialog.setIcon(R.mipmap.ic_launcher_round);//设置内容normalDialog.setMessage(getString(R.string.dialog_normal_content));//设置按钮normalDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text), new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(DialogActivity.this,getString(R.string.dialog_btn_confirm_hint_text),Toast.LENGTH_SHORT).show();dialog.dismiss();}});//创建并显示normalDialog.create().show();}
复制代码

系统对话框都是支持链式调用的,举例:

    new AlertDialog.Builder(this).setTitle(getString(R.string.dialog_normal_text)).setIcon(R.mipmap.ic_launcher_round).setMessage(getString(R.string.dialog_normal_content)).setPositiveButton(getString(R.string.dialog_btn_confirm_text), new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(DialogActivity.this,getString(R.string.dialog_btn_confirm_hint_text),Toast.LENGTH_SHORT).show();dialog.dismiss();}}).create().show();
复制代码

下面的代码都是可以用链式调用的,这里就不展示了。

2、普通对话框(多按钮)

在系统对话框中最多出现三个按钮,即PositiveButton(确定)、NegativeButton(取消)、NeutralButton(忽略)。

运行截图:

代码:

  private void showNormalMoreButtonDialog(){AlertDialog.Builder normalMoreButtonDialog = new AlertDialog.Builder(this);normalMoreButtonDialog.setTitle(getString(R.string.dialog_normal_more_button_text));normalMoreButtonDialog.setIcon(R.mipmap.ic_launcher_round);normalMoreButtonDialog.setMessage(getString(R.string.dialog_normal_more_button_content));//设置按钮normalMoreButtonDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text), new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(DialogActivity.this,getString(R.string.dialog_btn_confirm_hint_text),Toast.LENGTH_SHORT).show();dialog.dismiss();}});normalMoreButtonDialog.setNegativeButton(getString(R.string.dialog_btn_cancel_text), new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(DialogActivity.this,getString(R.string.dialog_btn_cancel_hint_text),Toast.LENGTH_SHORT).show();dialog.dismiss();}});normalMoreButtonDialog.setNeutralButton(getString(R.string.dialog_btn_neutral_text), new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(DialogActivity.this,getString(R.string.dialog_btn_neutral_hint_text),Toast.LENGTH_SHORT).show();dialog.dismiss();}});normalMoreButtonDialog.create().show();}
复制代码

也可以用下面的实现方式,和上面的代码效果是一样的。

  private void showNormalMoreButtonDialog(){DialogInterface.OnClickListener setListener = null;AlertDialog.Builder normalMoreButtonDialog = new AlertDialog.Builder(this);normalMoreButtonDialog.setTitle(getString(R.string.dialog_normal_more_button_text));normalMoreButtonDialog.setIcon(R.mipmap.ic_launcher_round);normalMoreButtonDialog.setMessage(getString(R.string.dialog_normal_more_button_content));setListener = new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {switch (which){case DialogInterface.BUTTON_POSITIVE:Toast.makeText(DialogActivity.this,getString(R.string.dialog_btn_confirm_hint_text),Toast.LENGTH_SHORT).show();dialog.dismiss();break;case DialogInterface.BUTTON_NEUTRAL:Toast.makeText(DialogActivity.this,getString(R.string.dialog_btn_neutral_hint_text),Toast.LENGTH_SHORT).show();dialog.dismiss();break;case DialogInterface.BUTTON_NEGATIVE:Toast.makeText(DialogActivity.this,getString(R.string.dialog_btn_cancel_hint_text),Toast.LENGTH_SHORT).show();dialog.dismiss();break;}}};normalMoreButtonDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text),setListener);normalMoreButtonDialog.setNegativeButton(getString(R.string.dialog_btn_cancel_text),setListener);normalMoreButtonDialog.setNeutralButton(getString(R.string.dialog_btn_neutral_text),setListener);normalMoreButtonDialog.create().show();}
复制代码

3、普通列表对话框

此种类型的对话框能实现简单的列表。

运行截图:

代码:

  /*** 普通列表dialog*/private void showListDialog(){final String listItems[] = new String[]{"listItems1","listItems2","listItems3","listItems4","listItems5","listItems6"};AlertDialog.Builder listDialog = new AlertDialog.Builder(this);listDialog.setTitle(getString(R.string.dialog_list_text));listDialog.setIcon(R.mipmap.ic_launcher_round);/*设置item 不能用setMessage()用setItemsitems : listItems[] -> 列表项数组listener -> 回调接口*/listDialog.setItems(listItems,new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(DialogActivity.this,listItems[which],Toast.LENGTH_SHORT).show();}});//设置按钮listDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text), new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});listDialog.create().show();}
复制代码

4、单选对话框

运行截图:

代码:

  private void showRadioDialog(){final String radioItems[] = new String[]{"radioItem1","radioItem1","radioItem1","radioItem1"};AlertDialog.Builder radioDialog = new AlertDialog.Builder(this);radioDialog.setTitle(getString(R.string.dialog_radio_text));radioDialog.setIcon(R.mipmap.ic_launcher_round);/*设置item 不能用setMessage()用setSingleChoiceItemsitems : radioItems[] -> 单选选项数组checkItem : 0 -> 默认选中的itemlistener -> 回调接口*/radioDialog.setSingleChoiceItems(radioItems, 0, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(DialogActivity.this,radioItems[which],Toast.LENGTH_SHORT).show();}});//设置按钮radioDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text), new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});radioDialog.create().show();}
复制代码

5、多选对话框

运行截图:

代码: private void showCheckBoxDialog(){

    final String checkBoxItems[] = new String[]{"checkBoxItems1","checkBoxItems2","checkBoxItems3","checkBoxItems4"};final boolean isCheck[] = new boolean[]{false,true,true,false};AlertDialog.Builder checkBoxDialog = new AlertDialog.Builder(this);checkBoxDialog.setTitle(getString(R.string.dialog_check_box_text));checkBoxDialog.setIcon(R.mipmap.ic_launcher_round);/*设置item 不能用setMessage()用setMultiChoiceItemsitems : radioItems[] -> 多选选项数组checkItems : isCheck[] -> 是否选中数组listener -> 回调接口*/checkBoxDialog.setMultiChoiceItems(checkBoxItems, isCheck, new DialogInterface.OnMultiChoiceClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which, boolean isChecked) {if (isChecked){Toast.makeText(DialogActivity.this,checkBoxItems[which] + "   选中",Toast.LENGTH_SHORT).show();}else {Toast.makeText(DialogActivity.this,checkBoxItems[which] + "   未选中",Toast.LENGTH_SHORT).show();}}});//设置按钮checkBoxDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text), new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});checkBoxDialog.create().show();}
复制代码

6、带输入框的弹窗

运行截图:

代码: private void showEditDialog(){

    final EditText edit = new EditText(this);AlertDialog.Builder editDialog = new AlertDialog.Builder(this);editDialog.setTitle(getString(R.string.dialog_edit_text));editDialog.setIcon(R.mipmap.ic_launcher_round);//设置dialog布局editDialog.setView(edit);//设置按钮editDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text), new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(DialogActivity.this,edit.getText().toString().trim(),Toast.LENGTH_SHORT).show();dialog.dismiss();}});editDialog.create().show();}
复制代码

7、自定义布局的对话框

此类型的对话框在实际项目开发中用到的地方比提示对话框用到的地方要多一些,不过在项目几乎上都是自定义的对话框...

运行截图:

布局文件:custom_dialog_layout.xml

      <TextViewandroid:id="@+id/dialog_text"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="15sp"android:textColor="@color/colorPrimary"android:gravity="center"android:padding="12dp"/><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@mipmap/ic_launcher"/><Buttonandroid:id="@+id/dialog_btn_confirm"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="@color/colorAccent"android:textSize="15sp"android:text="@string/dialog_btn_confirm_text"android:layout_centerHorizontal="true"/><Buttonandroid:id="@+id/dialog_btn_cancel"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="@color/colorAccent"android:textSize="15sp"android:text="@string/dialog_btn_cancel_text"android:layout_centerHorizontal="true"android:layout_alignParentRight="true"/></RelativeLayout></LinearLayout>
复制代码

代码:

  private void showLayoutDialog() {//加载布局并初始化组件View dialogView = LayoutInflater.from(this).inflate(R.layout.custom_dialog_layout,null);TextView dialogText = (TextView) dialogView.findViewById(R.id.dialog_text);Button dialogBtnConfirm = (Button) dialogView.findViewById(R.id.dialog_btn_confirm);Button dialogBtnCancel = (Button) dialogView.findViewById(R.id.dialog_btn_cancel);final AlertDialog.Builder layoutDialog = new AlertDialog.Builder(this);layoutDialog.setTitle(getString(R.string.dialog_custom_layout_text));layoutDialog.setIcon(R.mipmap.ic_launcher_round);layoutDialog.setView(dialogView);//设置组件dialogText.setText("我是自定义layout的弹窗!!");dialogBtnConfirm .setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(DialogActivity.this,"我是自定义layout的弹窗!!",Toast.LENGTH_SHORT).show();}});dialogBtnConfirm .setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {layoutDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {@Overridepublic void onDismiss(DialogInterface dialog) {dialog.dismiss();}});}});layoutDialog.create().show();}
复制代码

以上就是Android系统弹窗的几种实现方式,几乎涵盖了能解决各种简单需求。其中自定义布局的方式奠定了自定义弹窗的基本实现。

尾语

可以看出上面的几种实现方式都是通过AlertDialog类实现的。有兴趣的可以看Android源码中的AlertDialog类实现。

Android——最全的系统对话框(AlertDialog)详解相关推荐

  1. 必过SafetyNet!以MIUI开发版系统为例详解Android设备通过SafetyNet校验方法

    必过SafetyNet!以MIUI开发版系统为例详解Android设备通过SafetyNet校验方法 作者 梓沐啊_(KylinDemons) 版权声明 Copyright © 2021 KylinD ...

  2. Android系统(96)---Android 数据交换解析框架Gson使用详解

    Android 数据交换解析框架Gson使用详解 Json 是一种文本形式的数据交换格式,比 xml 更为轻量.Json 的解析和生成的方式很多,在 Android 平台上最常用的类库有 Gson 和 ...

  3. 号称全网最全CAD组合键功能详解

    左手键盘右手鼠标,一向都是大家熟悉的使用CAD的操作方式. 就算不信手拈来也基本了然于心. 然而如果现在问你,命令行隐藏了,应该怎么调用出来,你可以第一时间反应过来是什么组合键吗? 暂时忘记没关系,希 ...

  4. IBM p5服务器上的虚拟 分享,IBMp5服务器系统虚拟技术详解

    <IBMp5服务器系统虚拟技术详解>由会员分享,可在线阅读,更多相关<IBMp5服务器系统虚拟技术详解(10页珍藏版)>请在人人文库网上搜索. 1.IBM p5 服务器系统虚拟 ...

  5. Android低功耗蓝牙(BLE)使用详解

    代码地址如下: http://www.demodashi.com/demo/13390.html 与普通蓝牙相比,低功耗蓝牙显著降低了能量消耗,允许Android应用程序与具有更严格电源要求的BLE设 ...

  6. 全面的Spring Boot配置文件详解

    全面的Spring Boot配置文件详解 Spring Boot在工作中是用到的越来越广泛了,简单方便,有了它,效率提高不知道多少倍.Spring Boot配置文件对Spring Boot来说就是入门 ...

  7. c语言的指针详解ppt,最全的C语言指针详解.ppt

    最全的C语言指针详解.ppt 第6章 指针,6.1 指针定义与使用 6.2 指针与函数 6.3 指针与数组 6.4 指针与字符串 6.5 指针数组与多级指针 6.6 指针与动态内存分配 6.7 指针的 ...

  8. android自定义view案例,Android自定义View的实现方法实例详解

    一.自绘控件 下面我们准备来自定义一个计数器View,这个View可以响应用户的点击事件,并自动记录一共点击了多少次.新建一个CounterView继承自View,代码如下所示: 可以看到,首先我们在 ...

  9. Android JNI使用方法,JNI机制详解

    Android JNI使用方法,JNI机制详解 JNI的出现使得开发者既可以利用Java语言跨平台.类库丰 富.开发便捷等特点,又可以利用Native语言的高效. JNI是JVM实现中的一部分,因此N ...

最新文章

  1. 证明并推导汉诺塔(河内之塔)问题公式
  2. Fragment详解之二——基本使用方法
  3. python编译安装pyaudio
  4. [leetcode]83.Remove Duplicates from Sorted List
  5. 博后招募 | 澳大利亚悉尼大学徐畅老师招收深度学习方向博士后/全奖博士
  6. 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程
  7. phpcms ajax 调取文章内容,Phpcms V9列表页使用GET标签调用指定文章内容的方法
  8. 从0到1搭建spark集群---企业集群搭建
  9. Cocos2Dx之处理键盘输入
  10. javascript函数参数的传递问题
  11. apache配置cgi出错_Apache配置实现cgi-阿里云开发者社区
  12. 【收藏】基于Dockerfile搭建JAVA Tomcat运行环境
  13. python使用flask模块和前端交互基础
  14. 小程序uv访客怎么刷_免费小程序模板怎么选择?
  15. 数据控制—完整性约束
  16. 360校招笔试题总结4
  17. 谷歌浏览器打不开百度网页,其余搜索引擎都可以的解决办法
  18. 一篇文章上手docker(原理,部署,使用,坑)
  19. 第二、三范式与BC范式的区别
  20. 校园歌手大赛10分c语言,校园歌手大赛策划方案5

热门文章

  1. 本地修改服务器上的内容,本地修改指向服务器
  2. 平台允许同时在线人数 显示_《女神异闻录4G》Steam同时在线人数创新纪录
  3. 计算机网络(韩立刚网课笔记)
  4. linux下搭建博客Day8
  5. python月球地球质量计算_我们如何计算一个行星的质量?
  6. excel自动保存_做了4个小时的excel未保存怎么办,用这招,快速恢复未保存的数据...
  7. java 3500_学java开发3500价位的笔记本该侧重那些方面?
  8. 从.fig文件中提取数据
  9. 用php写成绩switch,帮我看一下,这个php的switch我写的对不对?
  10. how to install tensorflow-gpu==1.12.0