☰
Android Dialog总结
2026/10/23 7:00:54 网站建设 项目流程

文章目录

  • Dialog总结
    • Dialog继承关系
    • 核心API
      • 显示和隐藏
      • 取消行为
    • 系统内置控件
      • 提示框AlertDialog
      • 普通列表AlertDialog
      • 单选列表AlertDialog
      • 多选列表AlertDialog
      • 自定义AlertDialog
      • 普通圆形ProgressDialog
      • 普通条形progressDialog
      • 日期DatePickerDialog
      • 时间TimePickerDialog
    • 自定义Dialog(仿QQ弹窗)
    • 代码下载

Dialog总结

Dialog继承关系

java.lang.Object ↳ android.view.Dialog ↳ android.app.AlertDialog ↳ android.app.ProgressDialog ↳ android.app.DatePickerDialog ↳ android.app.TimePickerDialog ↳ android.app.CharacterPickerDialog

核心API

显示和隐藏

dialog.show()

  • 显示 Dialog
  • 触发 OnShowListener() 回调

dialog.dismiss()

  • 标准关闭方式
  • 完全移除 Dialog 并释放资源
  • 触发 OnDismissListener 回调

dialog.cancel()

  • 本质是调用 dismiss()
  • 额外会触发 OnCancelListener 回调

dialog.hide()

  • 仅隐藏 Dialog 的 View,不移除 Window
  • 不会触发任何回调
  • Dialog 对象仍然持有资源,没有被释放
  • 调用 show() 可以重新显示

取消行为

  • setCancelable()

    • 总开关
    • 设置true:用户可以通过返回键或点击外部区域触发 cancel()
    • 设置false,返回键和外部点击无效
  • setCanceledOnTouchOutside():

    • 只管理外部点击,前提设置 setCancelable(true)
    • 设置true:点击外部区域消失
    • 设置false:点击外部区域不消失

系统内置控件

提示框AlertDialog

newAlertDialog.Builder(context).setIcon(R.mipmap.ic_launcher).setTitle("系统提示").setMessage("这是一个普通AlertDialog").setNegativeButton("取消",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){Toast.makeText(context,"取消",Toast.LENGTH_SHORT).show();}}).setPositiveButton("确定",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){Toast.makeText(context,"确定",Toast.LENGTH_SHORT).show();}}).show();

普通列表AlertDialog

finalString[]fruits={"apple","banana","cherry","grape","mango","pear","pineapple","strawberry","watermelon"};newAlertDialog.Builder(context).setTitle("水果列表").setItems(fruits,newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){Toast.makeText(context,fruits[which],Toast.LENGTH_SHORT).show();}}).show();

单选列表AlertDialog

finalString[]fruits={"apple","banana","cherry","grape","mango","pear","pineapple","strawberry","watermelon"};newAlertDialog.Builder(context).setTitle("水果列表").setSingleChoiceItems(fruits,0,newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){Toast.makeText(context,fruits[which],Toast.LENGTH_SHORT).show();dialog.dismiss();}}).show();

多选列表AlertDialog

finalString[]fruits={"apple","banana","cherry","grape","mango","pear","pineapple","strawberry","watermelon"};finalboolean[]checkItems={false,false,false,false,false,false,false,false,false};newAlertDialog.Builder(context).setTitle("水果列表").setMultiChoiceItems(fruits,checkItems,newDialogInterface.OnMultiChoiceClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich,booleanisChecked){checkItems[which]=isChecked;}}).setPositiveButton("确定",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){Stringret="";for(inti=0;i<checkItems.length;i++){if(checkItems[i]){ret+=fruits[i]+" ";}}Toast.makeText(context,ret,Toast.LENGTH_SHORT).show();}}).show();

自定义AlertDialog

AlertDialog.Builderbuilder=newAlertDialog.Builder(context);AlertDialogalertDialog=builder.create();ViewdialogView=LayoutInflater.from(context).inflate(R.layout.dialog_custom_view,null);dialogView.findViewById(R.id.btnCancle).setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){alertDialog.dismiss();}});dialogView.findViewById(R.id.btnConfirm).setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Toast.makeText(context,"确定",Toast.LENGTH_SHORT).show();alertDialog.dismiss();}});alertDialog.setView(dialogView);alertDialog.setCancelable(false);//按返回键是否取消alertDialog.setCanceledOnTouchOutside(false);//点击Dialog外部是否取消alertDialog.show();

普通圆形ProgressDialog

ProgressDialog.show(MainActivity.this,"提示","正在加载。。。",false,true);

普通条形progressDialog

progressDialog = new ProgressDialog(context); progressDialog.setTitle("提示"); progressDialog.setMessage("正在加载。。。"); progressDialog.setCancelable(true); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.setIndeterminate(false);//是否显示进度,必须设置为false才显示 progressDialog.show();

日期DatePickerDialog

Calendarcalendar=Calendar.getInstance();newDatePickerDialog(context,newDatePickerDialog.OnDateSetListener(){@OverridepublicvoidonDateSet(DatePickerview,intyear,intmonth,intdayOfMonth){Stringret="";ret=year+"年"+(month+1)+"月"+dayOfMonth+"日";Toast.makeText(context,ret,Toast.LENGTH_SHORT).show();}},calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH)).show();

时间TimePickerDialog

Calendarcalendar=Calendar.getInstance();newTimePickerDialog(context,android.app.AlertDialog.THEME_HOLO_LIGHT,newTimePickerDialog.OnTimeSetListener(){@OverridepublicvoidonTimeSet(TimePickerview,inthourOfDay,intminute){Stringret="";ret=hourOfDay+"时"+minute+"分";Toast.makeText(context,ret,Toast.LENGTH_SHORT).show();}},calendar.get(Calendar.HOUR_OF_DAY),calendar.get(Calendar.MINUTE),true).show();

自定义Dialog(仿QQ弹窗)

dialog常用样式

<stylename="DialogStyle"><!--是否显示Title --> <item name="android:windowNoTitle">true</item> <!--Dialog中Window的背景颜色--> <item name="android:windowBackground">@android:color/transparent</item> <!--Dialog背景颜色--> <item name="android:background">@android:color/transparent</item> <!--去除边框--> <item name="android:windowFrame">@null</item> <!--Dialog外部区域是否模糊--> <item name="android:backgroundDimEnabled">true</item> <!--Dialog外部区域模糊度,当值为1 时,除了dialog以外的部分全黑--> <item name="android:backgroundDimAmount">0.6</item> <!--是否浮现在activity之上--> <item name="android:windowIsFloating">true</item> <!--是否半透明--> <item name="android:windowIsTranslucent">true</item> <!--竖屏状态下的dialog最小宽度--> <!-- <item name="android:windowMinWidthMinor">100%</item>--> <!--横屏状态下的dialog最小宽度--> <!-- <item name="android:windowMinWidthMajor">100%</item>--></style><stylename="DialogStyle.Animation"parent="DialogStyle"><!-- dialog动画--> <item name="android:windowAnimationStyle">@style/DialogAnim</item></style>

设置Dialog动画

<?xml version="1.0" encoding="utf-8"?><!--进入动画--><translatexmlns:android="http://schemas.android.com/apk/res/android"android:duration="200"android:fromYDelta="100%"android:interpolator="@android:anim/accelerate_interpolator"android:toXDelta="0"/>
<?xml version="1.0" encoding="utf-8"?><!--进入动画--><translatexmlns:android="http://schemas.android.com/apk/res/android"android:duration="200"android:fromYDelta="0%"android:interpolator="@android:anim/accelerate_interpolator"android:toYDelta="100%"/>
<stylename="DialogAnim"parent="android:Animation"><item name="android:windowEnterAnimation">@anim/anim_enter</item> <item name="android:windowExitAnimation">@anim/anim_exit</item></style>

自定义Dialog:

classQQDialog(context:Context):Dialog(context,R.style.DialogStyle_Animation),View.OnClickListener{privatelateinitvarvideo:TextViewprivatelateinitvarphoto:TextViewprivatelateinitvarcancel:TextViewoverridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.dialog_qq)window?.apply{setLayout(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT)//设置宽高setGravity(Gravity.BOTTOM)//设置显示位置}setCanceledOnTouchOutside(true)//点击外部区域是否取消setCancelable(true)//按返回键是否取消initViews()}privatefuninitViews(){video=findViewById(R.id.video)photo=findViewById(R.id.photo)cancel=findViewById(R.id.cancel)video.setOnClickListener(this)photo.setOnClickListener(this)cancel.setOnClickListener(this)}overridefunonClick(view:View){when(view.id){R.id.video->{dismiss()mOnDialogClickListener?.onVideoClick()}R.id.photo->{dismiss()mOnDialogClickListener?.onPhotoClick()}R.id.cancel->dismiss()}}interfaceOnDialogClickListener{funonVideoClick()funonPhotoClick()}privatevarmOnDialogClickListener:OnDialogClickListener?=nullfunsetOnDialogClickListener(onDialogClickListener:OnDialogClickListener){mOnDialogClickListener=onDialogClickListener}}

使用

valqqDialog=QQDialog(mContext)qqDialog.setOnDialogClickListener(object:QQDialog.OnDialogClickListener{overridefunonVideoClick(){ToastUtils.show("点击了视频")}overridefunonPhotoClick(){ToastUtils.show("点击了相册")}})qqDialog.show()

代码下载

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询