在实际应用开发中,用到系统对话框中的情况几乎是没有的。按开发流程来说,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);
//设置title
normalDialog.setTitle(getString(R.string.dialog_normal_text));
//设置icon
normalDialog.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() {
@Override
public 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() {
@Override
public 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() {
@Override
public 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() {
@Override
public 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() {
@Override
public 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() {
@Override
public 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()
用setItems
items : listItems[] -> 列表项数组
listener -> 回调接口
*/
listDialog.setItems(listItems,new DialogInterface.OnClickListener() {
@Override
public 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() {
@Override
public 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()
用setSingleChoiceItems
items : radioItems[] -> 单选选项数组
checkItem : 0 -> 默认选中的item
listener -> 回调接口
*/
radioDialog.setSingleChoiceItems(radioItems, 0, new DialogInterface.OnClickListener() {
@Override
public 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() {
@Override
public 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()
用setMultiChoiceItems
items : radioItems[] -> 多选选项数组
checkItems : isCheck[] -> 是否选中数组
listener -> 回调接口
*/
checkBoxDialog.setMultiChoiceItems(checkBoxItems, isCheck
, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public 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() {
@Override
public 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() {
@Override
public 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

      <TextView
android: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"/> <RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"> <ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"/> <Button
android: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"/> <Button
android: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() {
@Override
public void onClick(View v) {
Toast.makeText(DialogActivity.this,"我是自定义layout的弹窗!!",Toast.LENGTH_SHORT).show();
}
});
dialogBtnConfirm .setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
layoutDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
dialog.dismiss();
}
});
}
}); layoutDialog.create().show();
}

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

尾语

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

我的个人博客Jetictors

我的掘金Jetictors

GithubJetictors

欢迎各位大佬进群共同研究、探索

QQ群号:497071402

Android———最详细的系统对话框使用的更多相关文章

  1. Android———最详细的系统对话框(AlertDialog)详解

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

  2. Android系统对话框——自定义关闭

    Android系统对话框--自定义关闭 Dialog是我们在项目中经常用到的,5.x以后的Dialog也很好看,很安卓风,Android也给我们提供了新的包,低版本可以显示一样的效果.我们在使用的导入 ...

  3. Android系统对话框

    Android系统对话框 效果图 2个按钮的对话框 3个按钮的对话框 自定义View的对话框 单选对话框 多选对话框 列表框 Code XML <?xml version="1.0&q ...

  4. Android中制作自定义dialog对话框的实例

    http://www.jb51.net/article/83319.htm   这篇文章主要介绍了Android中制作自定义dialog对话框的实例分享,安卓自带的Dialog显然不够用,因而我们要继 ...

  5. linux安装 Android Studio详细教程,支持性较差,需要安装最新底层库内核的linux

    安装 Android Studio详细教程 libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5 lib32z1 jdk1.8.0_25 android-st ...

  6. Firefly 3288又一次制作android和lubuntu双系统固件

    又一次制作android和lubuntu双系统固件 因为本人改动了lubuntu的驱动和设备树信息,为了方便烧写系统,所以又一次制作了双系统的固件. Firefly wiki教程里有android固件 ...

  7. Android 12(S) 图形显示系统 - 应用建立和SurfaceFlinger的沟通桥梁(三)

    1 前言 上一篇文章中我们已经创建了一个Native示例应用,从使用者的角度了解了图形显示系统API的基本使用,从这篇文章开始我们将基于这个示例应用深入图形显示系统API的内部实现逻辑,分析运作流程. ...

  8. Android 12(S) 图形显示系统 - SurfaceFlinger的启动和消息队列处理机制(四)

    1 前言 SurfaceFlinger作为Android图形显示系统处理逻辑的核心单元,我们有必要去了解其是如何启动,初始化及进行消息处理的.这篇文章我们就来简单分析SurfaceFlinger这个B ...

  9. Android 12(S) 图形显示系统 - createSurface的流程(五)

    题外话 刚刚开始着笔写作这篇文章时,正好看电视在采访一位92岁的考古学家,在他的日记中有这样一句话,写在这里与君共勉"不要等待幸运的降临,要去努力的掌握知识".如此朴实的一句话,此 ...

随机推荐

  1. 201521123028《Java程序设计》第1周学习总结

    1. 本周学习总结 通过本周的学习: 1.了解了Java的发展史(从OAK转向Internet,并逐步发展至今的历程) 2.与C语言比较,Java语言的特点: ①将源程序编译成一种结构中立的中间文件格 ...

  2. 201521123042《Java程序设计》第13周学习总结

    本次作业参考文件 正则表达式参考资料 1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.bai ...

  3. 201521123048 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  4. 201521123079《java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...

  5. Linux-hexdump命令调试event驱动—详解(13)

    hexdump: 查看文件的内容,比如二进制文件中包含的某些字符串,通常用来调试驱动用 1.调试 键盘驱动 讲解 当我们insmod挂载了键盘驱动后,找到键盘驱动被放在event1设备里, 此时没有按 ...

  6. Spring - lookup-method方式实现依赖注入

    引言 假设一个单例模式的bean A需要引用另外一个非单例模式的bean B,为了在我们每次引用的时候都能拿到最新的bean B,我们可以让bean A通过实现ApplicationContextWa ...

  7. Hibernate中fetch和lazy介绍

    fetch ,指定关联对象抓取的方式,可以设置fetch = "select" 和 fetch = "join".select方式时先查询返回要查询的主体对象( ...

  8. css控制div强制换行

    div{white-space:nowrap;} 自动换行 div{ word-wrap: break-word; word-break: normal; } 强制英文单词断行 div{word-br ...

  9. 解决外部编辑器修改Eclipse文件延迟刷新【补充】

    在之前的文章,使用gulp解决外部编辑器修改Eclipse文件延迟刷新,原理是用gulp把更改过的项目文件直接复制一份到Tomcat的webapp.root下, 现在补充另外一种方法,双击Server ...

  10. mybatis 错误CGLIB is not available

    ### Error querying database. Cause: java.lang.IllegalStateException: Cannot enable lazy loading beca ...