在一个Activity中使用多个Dialog

本文介绍如何在Android应用中通过重写Activity.onCreateDialog()方法来统一管理多种Dialog,包括创建及显示简单对话框、列表对话框、单选对话框和多选对话框等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android Dev-Guide 推荐重写Activity.onCreateDialog()方法来创建Dialog,这样Dialog就归属于这个Activity了。使用方法是这样的,Activity.showDialog()激发Activity.onCreateDialog()创建Dialog,然后显示之,便于多个Dialog的统一管理。注意,以后再用Activity.showDialog()显示同一个Dialog时,则不会调用Activity.onCreateDialog(),而是调用Activity.onPrepareDialog(),使用上一次显示Dialog时的状态。即
第一次:showDialog() -> onCreatedialog()
以后: showDialog() -> onPrepareDialog()

在示例代码中,分别用createExitDialog(),createListDialog(),createRadioDialog(),createCheckboxDialog(),创建4种Dialog,并在Activity中显示。示例代码如下:


Java代码 收藏代码
  1. packagecom.ipjmc.dialog;
  2. importandroid.app.Activity;
  3. importandroid.app.AlertDialog;
  4. importandroid.app.Dialog;
  5. importandroid.content.DialogInterface;
  6. importandroid.os.Bundle;
  7. importandroid.util.Log;
  8. importandroid.widget.Toast;
  9. publicclassShowDialogActivityextendsActivity{
  10. /**Calledwhentheactivityisfirstcreated.*/
  11. publicstaticfinalStringTAG="ShowDialog";
  12. publicstaticfinalintID_EXIT_DIALOG=1;
  13. publicstaticfinalintID_LIST_DIALOG=2;
  14. publicstaticfinalintID_RADIO_DIALOG=3;
  15. publicstaticfinalintID_CHECKBOX_DIALOG=4;
  16. @Override
  17. publicvoidonCreate(BundlesavedInstanceState){
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.main);
  20. showDialog(ID_EXIT_DIALOG);
  21. showDialog(ID_LIST_DIALOG);
  22. showDialog(ID_RADIO_DIALOG);
  23. showDialog(ID_CHECKBOX_DIALOG);
  24. }
  25. @Override
  26. protectedDialogonCreateDialog(intid){
  27. //TODOAuto-generatedmethodstub
  28. Dialogdialog=null;
  29. switch(id){
  30. caseID_EXIT_DIALOG:
  31. dialog=createExitDialog();
  32. break;
  33. caseID_LIST_DIALOG:
  34. dialog=createListDialog();
  35. break;
  36. caseID_RADIO_DIALOG:
  37. dialog=createRadioDialog();
  38. break;
  39. caseID_CHECKBOX_DIALOG:
  40. dialog=createCheckboxDialog();
  41. break;
  42. default:
  43. break;
  44. }
  45. if(dialog!=null){
  46. Log.i(TAG,dialog.toString());
  47. }else{
  48. Log.i(TAG,"dialog=null");
  49. }
  50. returndialog;
  51. }
  52. @Override
  53. protectedvoidonPrepareDialog(intid,Dialogdialog){
  54. //TODOAuto-generatedmethodstub
  55. super.onPrepareDialog(id,dialog);
  56. }
  57. //创建简单Dialog
  58. publicDialogcreateExitDialog(){
  59. AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
  60. builder.setMessage("Areyousureyouwanttoexit?")
  61. .setCancelable(false)
  62. .setPositiveButton("Yes",newDialogInterface.OnClickListener(){
  63. publicvoidonClick(DialogInterfacedialog,intid){
  64. ShowDialogActivity.this.finish();
  65. }
  66. })
  67. .setNegativeButton("No",newDialogInterface.OnClickListener(){
  68. publicvoidonClick(DialogInterfacedialog,intid){
  69. dialog.cancel();
  70. }
  71. });
  72. returnbuilder.create();
  73. }
  74. //创建ListDialog
  75. publicDialogcreateListDialog(){
  76. finalCharSequence[]items={"Red","Green","Blue"};
  77. AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
  78. builder.setTitle("Pickacolor");
  79. builder.setItems(items,newDialogInterface.OnClickListener(){
  80. publicvoidonClick(DialogInterfacedialog,intitem){
  81. Toast.makeText(getApplicationContext(),items[item],Toast.LENGTH_SHORT).show();
  82. }
  83. });
  84. returnbuilder.create();
  85. }
  86. //创建单选Dialog
  87. publicDialogcreateRadioDialog(){
  88. finalCharSequence[]items={"Red","Green","Blue"};
  89. AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
  90. builder.setTitle("Pickacolor");
  91. builder.setSingleChoiceItems(items,-1,newDialogInterface.OnClickListener(){
  92. publicvoidonClick(DialogInterfacedialog,intposition){
  93. Toast.makeText(getApplicationContext(),position+"->"+items[position],Toast.LENGTH_SHORT).show();
  94. dialog.dismiss();
  95. }
  96. });
  97. returnbuilder.create();
  98. }
  99. //创建多选Dialog
  100. publicDialogcreateCheckboxDialog(){
  101. finalCharSequence[]items={"Red","Green","Blue"};
  102. finalboolean[]checked=newboolean[]{false,false,false};
  103. AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
  104. builder.setTitle("Pickacolor");
  105. builder.setMultiChoiceItems(items,checked,newDialogInterface.OnMultiChoiceClickListener(){
  106. @Override
  107. publicvoidonClick(DialogInterfacedialog,intwhich,booleanisChecked){
  108. //TODOAuto-generatedmethodstub
  109. }
  110. });
  111. builder.setPositiveButton("确定",newDialogInterface.OnClickListener(){
  112. publicvoidonClick(DialogInterfacedialog,intid){
  113. ShowDialogActivity.this.finish();
  114. }
  115. })
  116. .setNegativeButton("取消",newDialogInterface.OnClickListener(){
  117. publicvoidonClick(DialogInterfacedialog,intid){
  118. dialog.cancel();
  119. }
  120. });
  121. returnbuilder.create();
  122. }
  123. }

一个通用的Android端弹窗管理框架,内部维护弹窗优先级队列 具备弹窗管理扩展功能 整合Dialog,PoupoWindow,悬浮Widget,透明Webview,Toast,SnackBar,无需再为繁琐的业务弹窗逻辑所困扰如何添加依赖只需要两行代码轻松接入//add this to your repositories  maven { url 'https://www.jitpack.io' } //add this to your dependencies implementation 'com.github.MrCodeSniper:PopLayer:2.0.0'具体如何使用1.根据策略创建对应的弹窗view//Dialog形式 PopLayerView  mLayerView = new PopLayerView(this,R.layout.common_dialog_upgrade_app); //透明Webview形式 PopLayerView mLayerView = new PopLayerView(this,LayerConfig.redPocketScheme);2.开始装配弹窗配置Popi mUpgradePopi1 = new Popi.Builder()                 .setmPopId(4)//弹窗的唯一标识 当id发生改变 视为新的弹窗                 .setmPriority(2)//优先级这里不具体划分对应的范围 值越小优先级越高                 .setmCancelType(TRIGGER_CANCEL)//弹窗消失的类型分为 TRIGGER_CANCEL(触摸消失) COUNTDOWN_CANCEL (延时消失)                 .setMaxShowTimeLength(5)//最长显示时间(S)                 .setMaxShowCount(5)//最大显示次数                 .setmBeginDate(1548858028)//开始时间 2019-01-30 22:20:28                 .setmEndDate(1548944428)//结束时间 2019-01-31 22:20:28                 .setLayerView(mLayerView)//弹窗View                 .build();3.纳入弹窗管理//纳入弹窗管理 PopManager.getInstance().pushToQueue(mUpgradePopi); //开始显示弹窗 PopManager.getInstance().showNextPopi();效果预览未来的计划逐步统一 其他类型的弹窗 希望能提供给大家一个较为全面的应对业务需求的弹窗管理框架版本记录V1方案版本号LOG进度更新V1.0.0项目开源,完成弹窗管理与Dialog形式扩展Dialog策略扩展完成V1.0.1修复Dialog策略无法获取dialog实体bugDialog策略优化V1.0.2修复activity摧毁造成的弹窗异常 bugDialog策略优化V1.0.3优化了弹窗的使用更加方便快捷框架使用优化V2方案版本号LOG进度更新V2.0.0正式加入透明Webview弹窗策略扩展透明Webview策略扩展完成作者介绍Hello 我叫lalala,如果您喜欢这个项目 请给个star 能follow我那真是太好了!!
如果你想让多个 Activity Dialog 窗口都置顶,可以考虑使用一个辅助类来管理所有的 Dialog 窗口。以下是一种可行的实现方式: 1. 创建一个名为 `DialogManager` 的辅助类,并添加以下代码: ```java public class DialogManager { private static ArrayList<Dialog> sDialogs = new ArrayList<>(); public static void addDialog(Dialog dialog) { if (!sDialogs.contains(dialog)) { sDialogs.add(dialog); updateDialogs(); } } public static void removeDialog(Dialog dialog) { if (sDialogs.contains(dialog)) { sDialogs.remove(dialog); updateDialogs(); } } private static void updateDialogs() { Dialog topDialog = null; for (Dialog dialog : sDialogs) { if (dialog.isShowing()) { if (topDialog == null || dialog.getWindow().getAttributes().type > topDialog.getWindow().getAttributes().type) { topDialog = dialog; } } } if (topDialog != null) { topDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); topDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); } } } ``` 这个类维护了一个 `sDialogs` 静态成员变量,用于存储所有的 Dialog 窗口。`addDialog()` 和 `removeDialog()` 方法分别用于添加和删除 Dialog 窗口。`updateDialogs()` 方法会在 Dialog 窗口被添加或删除时调用,它会找到当前最顶层的 Dialog 窗口,并将其置顶。 2. 在每个需要显示 Dialog 窗口的 Activity 中,重写 `onCreateDialog()` 方法,并在其中添加以下代码: ```java @Override protected Dialog onCreateDialog(int id) { Dialog dialog = new Dialog(this); // 设置 Dialog 窗口的属性 DialogManager.addDialog(dialog); return dialog; } @Override protected void onStop() { super.onStop(); DialogManager.removeDialog(getDialog()); } ``` 这将会在每个 Activity 中创建一个 Dialog 窗口,并将其添加到 `DialogManager` 中进行管理。当 Activity 停止时,需要将其对应的 Dialog 窗口从 `DialogManager` 中删除。 请注意,在添加 `TYPE_SYSTEM_ALERT` 类型的窗口时,需要申请 `android.permission.SYSTEM_ALERT_WINDOW` 权限。如果你的应用程序的 targetSdkVersion 是 26 或更高版本,则还需要在 AndroidManifest.xml 文件中添加该权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值