对话框的概念:

对话框是提示用户作出决定,输入额外信息或显示某种状态的小窗口,通常不会填充整个屏幕,用于进行一些额外交互。

对话框的特点:

1, 当前界面弹出的小窗口.

2, 用户要与它进行交互, 可以接收用户输入的信息, 也可以反馈信息给用户.

Dialog类是dialog对话框的基类,Dialog基类中并没有定义界面,所以如果使用dialog类设置弹出框,需要使用xml自定义UI。系统自带了几个dialog派生的弹出框,并设置好了UI,可以直接调用系统自带的dialog衍生品,具体如下。除此之外,activity和fragment也可以作为dialog样式弹出使用,比如DialogFragment,使用 DialogFragment 管理对话框可确保它能正确处理生命周期事件,如用户按“返回”按钮或旋转屏幕时。

java.lang.Object
↳  android.app.Dialog
Known Direct Subclasses
AlertDialog, CharacterPickerDialog, MediaRouteChooserDialog, MediaRouteControllerDialog, PresentationKnown Indirect Subclasses
DatePickerDialog, ProgressDialog, TimePickerDialog

使用Alert Dialog等衍生类定义对话框

先上效果图:

      

下面是代码:

public class DialogActivity extends AppCompatActivity implements View.OnClickListener {private int choice = -1;public static void newInstance(Context context){Intent intent = new Intent(context, DialogActivity.class);
//        intent.putExtra("data", data);context.startActivity(intent);}@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_dialog);Button btnAlertdialog = (Button) findViewById(R.id.btn_alertdialog);btnAlertdialog.setOnClickListener(this);Button btnAlertdialog2 = (Button) findViewById(R.id.btn_alertdialog2);btnAlertdialog2.setOnClickListener(this);Button btnSingleDialog = (Button) findViewById(R.id.btn_single_dialog);btnSingleDialog.setOnClickListener(this);Button btnMultiDialog = (Button) findViewById(R.id.btn_multi_dialog);btnMultiDialog.setOnClickListener(this);Button btnProgressDialog = (Button) findViewById(R.id.btn_progress_dialog);btnProgressDialog.setOnClickListener(this);Button btnProgressDialog2 = (Button) findViewById(R.id.btn_progress_dialog2);btnProgressDialog2.setOnClickListener(this);Button btnEditDialog = (Button) findViewById(R.id.btn_edit_dialog);btnEditDialog.setOnClickListener(this);Button btnCustomDialog = (Button) findViewById(R.id.btn_custom_dialog);btnCustomDialog.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()){/*** 普通的 AlertDialog*/case R.id.btn_alertdialog:AlertDialog.Builder dialog = new AlertDialog.Builder(this);dialog.setIcon(R.mipmap.ic_launcher_round);dialog.setTitle("普通 AlertDialog");dialog.setMessage("Dialog对话框之:\n AlertDialog");dialog.setCancelable(false);    //设置是否可以通过点击对话框外区域或者返回按键关闭对话框dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(DialogActivity.this, "确定", Toast.LENGTH_SHORT).show();}});dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(DialogActivity.this, "取消", Toast.LENGTH_SHORT).show();}});//3个按钮
//                dialog.setNeutralButton("等待", new DialogInterface.OnClickListener() {
//                    @Override
//                    public void onClick(DialogInterface dialog, int which) {
//                        Toast.makeText(DialogActivity.this, "等待", Toast.LENGTH_SHORT).show();
//                    }
//                });dialog.show();break;/*** 列表的 AlertDialog*/case R.id.btn_alertdialog2:final String[] items = { "列表1", "列表2", "列表3" };AlertDialog.Builder listDialog = new AlertDialog.Builder(this);listDialog.setIcon(R.mipmap.ic_launcher_round);listDialog.setTitle("列表 AlertDialog");listDialog.setItems(items, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {//which下标从0开始, 代表当前选择的Item下标Toast.makeText(DialogActivity.this, "你点击了:" + items[which], Toast.LENGTH_SHORT).show();}});listDialog.show();break;/*** 单选 AlertDialog* 备注:匿名类可以访问外部类的所有成员,包裹该匿名类的方法中的所有final类型的局部变量。*      此处的 choice 变量若定为局部变量,则必须声明为final类型,但是这样就不能完成匿名类内部赋值,故声明为外部属性*/case R.id.btn_single_dialog:final String[] item = { "单选1", "单选2", "单选3" };AlertDialog.Builder singleDialog = new AlertDialog.Builder(this);singleDialog.setIcon(R.mipmap.ic_launcher_round);singleDialog.setTitle("单选 AlertDialog");singleDialog.setSingleChoiceItems(item, 0, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {choice = which;}});singleDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(DialogActivity.this, "你选择了:" + item[choice], Toast.LENGTH_SHORT).show();}});singleDialog.show();break;/*** 多选 AlertDialog* 备注:Boolean 是boolean 的实例化对象类,和Integer对应int一样*/case R.id.btn_multi_dialog:final String[] multiItem = {"多选1", "多选2", "多选3"};final boolean[] checkedItem = {false, false, false};   //基础不牢固,boolean写错成Boolean搞了半天AlertDialog.Builder multiDialog = new AlertDialog.Builder(this);multiDialog.setIcon(R.mipmap.ic_launcher_round);multiDialog.setTitle("多选 AlertDialog");multiDialog.setMultiChoiceItems(multiItem, checkedItem, new DialogInterface.OnMultiChoiceClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which, boolean isChecked) {checkedItem[which] = isChecked;}});multiDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {StringBuilder str = new StringBuilder();for (int i=0; i<checkedItem.length; i++ ){if (checkedItem[i]){str.append(multiItem[i]);}}Toast.makeText(DialogActivity.this, "你选择了:" + str , Toast.LENGTH_SHORT).show();}});multiDialog.show();break;/*** 等待 ProgressDialog* 可以用于下载等事件完成后,主动调用函数关闭该Dialog*/case R.id.btn_progress_dialog:ProgressDialog waitDialog = new ProgressDialog(this);waitDialog.setIcon(R.mipmap.ic_launcher_round);waitDialog.setTitle("等待 ProgressDialog");waitDialog.setMessage("请稍等");waitDialog.setProgressStyle(STYLE_SPINNER);waitDialog.setCancelable(true);waitDialog.show();break;/*** 进度条 ProgressDialog* 可以在子线程中直接调用setProgress方法更新UI,这个方法内已经处理了子线程里调用的情况了*/case R.id.btn_progress_dialog2:final ProgressDialog progressDialog = new ProgressDialog(this);progressDialog.setIcon(R.mipmap.ic_launcher_round);progressDialog.setTitle("进度条 ProgressDialog");progressDialog.setMessage("正在加载,请稍后……");progressDialog.setIndeterminate(false); //设置是否进入模糊状态,可以设置为true看看progressDialog.setMax(80);progressDialog.setProgressStyle(STYLE_HORIZONTAL);progressDialog.show();progressDialog.setProgress(0); //设置进度值, 在显示对话后,才可以设置new Thread(new Runnable() {@Overridepublic void run() {int progress = 0;while (progress < 80){try {Thread.sleep(100);progress++;progressDialog.setProgress(progress);} catch (InterruptedException e) {e.printStackTrace();}}progressDialog.dismiss();}}).start();break;/*** 编辑 AlertDialog* @setView 方法装入了一个EditText* 该方法其实就是替换标题和下方按钮中间的那部分布局*/case R.id.btn_edit_dialog:final EditText editText = new EditText(this);AlertDialog.Builder editDialog = new AlertDialog.Builder(this);editDialog.setIcon(R.mipmap.ic_launcher_round);editDialog.setTitle("编辑 AlertDialog").setView(editText);editDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(DialogActivity.this, "输入的内容为:" + editText.getText().toString(), Toast.LENGTH_SHORT).show();}});editDialog.show();break;/*** 自定义 AlertDialog* 添加的自定义布局实际上修改的也只是标题和下方按钮中间的那部分布局,标题和按钮都还用Android原生的*/case R.id.btn_custom_dialog:AlertDialog.Builder customDialog = new AlertDialog.Builder(this);customDialog.setIcon(R.mipmap.ic_launcher_round);//填充设置好的自定义布局View dialogView = getLayoutInflater().inflate(R.layout.dialog_custom, null);Button growth = (Button) dialogView.findViewById(R.id.btn_growth);growth.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(DialogActivity.this, "好好学习,努力沉淀", Toast.LENGTH_SHORT).show();}});customDialog.setTitle("自定义 AlertDialog");customDialog.setView(dialogView);customDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}});//该方法会返回一个AlertDialog对象,可以用来调用dismiss方法//AlertDialog alertDialog = new AlertDialog.Builder(this).create();或者通过该方式创建AlertDialogcustomDialog.show();break;/*** 日期 DatePickerDialog* 不同系统版本该控件样式风格也不同*/case R.id.btn_date_dialog://获取系统的当前日期Calendar calendar = Calendar.getInstance();int year = calendar.get(Calendar.YEAR);int month = calendar.get(Calendar.MONTH);int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);DatePickerDialog dateDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {@Overridepublic void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {Toast.makeText(DialogActivity.this, year + "年" + (month+1) + "月" + dayOfMonth + "日", Toast.LENGTH_SHORT).show();}}, year, month, dayOfMonth);dateDialog.show();break;/*** 时间 TimePickerDialog*/case R.id.btn_time_dialog://获取系统当前时间Calendar calendar1 = Calendar.getInstance();int hour = calendar1.get(Calendar.HOUR_OF_DAY);int minute = calendar1.get(Calendar.MINUTE);TimePickerDialog timeDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {@Overridepublic void onTimeSet(TimePicker view, int hourOfDay, int minute) {Toast.makeText(DialogActivity.this, hourOfDay + ":" + minute, Toast.LENGTH_SHORT).show();}}, hour, minute, true);timeDialog.show();break;/*** 日期时间对话框* 如果把时间对话框部分放在DatePickerDialog中会出现,timePickerDialog显示两次的情况*/case R.id.btn_date_time_dialog:Calendar calendar2 = Calendar.getInstance();int year2 = calendar2.get(Calendar.YEAR);int month2 = calendar2.get(Calendar.MONTH);int dayOfMonth2 = calendar2.get(Calendar.DAY_OF_MONTH);int hour2 = calendar2.get(Calendar.HOUR_OF_DAY);int minute2 = calendar2.get(Calendar.MINUTE);DatePickerDialog datePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {@Overridepublic void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {Toast.makeText(DialogActivity.this, year + "年" + (month+1) + "月" + dayOfMonth + "日", Toast.LENGTH_SHORT).show();}}, year2, month2, dayOfMonth2);TimePickerDialog timePickerDialog = new TimePickerDialog(DialogActivity.this, new TimePickerDialog.OnTimeSetListener() {@Overridepublic void onTimeSet(TimePicker view, int hourOfDay, int minute) {Toast.makeText(DialogActivity.this, hourOfDay + ":" + minute, Toast.LENGTH_SHORT).show();Log.e("DialogActivity", hourOfDay + ":" + minute);}}, hour2, minute2, true);timePickerDialog.show();datePickerDialog.show();break;default:break;}}
}

附上一些还不错的:

https://www.cnblogs.com/xiaoluo501395377/p/3419398.html

https://blog.csdn.net/u010694658/article/details/53022294

https://blog.csdn.net/wjr1949/article/details/70959969

使用Dialog定义对话框

https://blog.csdn.net/xinxin__/article/details/78865874

https://blog.csdn.net/zxhandroid/article/details/72851959

使用DialogFragment定义对话框

https://blog.csdn.net/luanpeng825485697/article/details/78657616

https://blog.csdn.net/vampire2777/article/details/54917728

https://blog.csdn.net/helang296479893/article/details/80094970

https://blog.csdn.net/androidstarjack/article/details/73824885

Android Dialog弹出对话框整理总结相关推荐

  1. android自定义弹出对话框,使用FlyDialog实现自定义Android弹窗对话框

    前言 学习的时候要用到弹窗,但是又觉得i同自带的弹窗样式有点不太美观,搜索资料后发现了FlycoDialog这个开源库,效果很好,而且实现起来也比较方便. 先列举一些比较好看的效果: NormalLi ...

  2. Android Dialog弹出方式动画

    //自定义Dialogclass myDialog extends Dialog{private Window window = null;public myDialog(Context contex ...

  3. 安卓Dialog弹出对话框全解:包含了AlertDialog,DialogFragment

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 Dialog基类中并没有定义界面,所以如果使用dialog类设置弹出框,需要使用xml自定义UI. 当然系统也自带了几个dialog派生的弹出框,例如 ...

  4. Dialog弹出对话框使用

    文章目录 前言 一.对话框 1.自定义dialog样式 1.dialog_delect.xml 2.shape_dialog.xml 3.styles.xml 2.使用显示对话框的方法 总结 前言 自 ...

  5. Android dialog 弹出时,保持 隐藏 navigation bar(虚拟栏)

    1.概述 一些场合,要求界面是全屏的,然而在全屏界面下,弹出dialog 会导致虚拟按键栏又重新弹出来,也是比较难受的.(而且查了非常多方法都是不能完美的解决这个问题,要么是压根不能用,要么是会闪一下 ...

  6. Android 全局弹出对话框

    方案一 :使用系统弹窗权限 1.1 .先加权限 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDO ...

  7. Android Dialog 弹出的时候标题栏闪烁一下的处理方法

    之前记录过一篇 dialog 关闭的时候 标题栏会闪烁一下,最近新项目出现关闭的时候闪烁一下 弹出dialog 标题栏闪烁的处理方法 关闭的时候自己的处理方法:就是设置Flags ,代码大致如下 Al ...

  8. android fragment 弹出对话框,Android DialogFragment弹框实现

    前言: 网上说了一堆好处,我只说自己深有体会的两点吧 1.屏幕横竖屏切换的时候,弹框可以保存状态 2.可以在popwindow中使用 使用步骤 1.创建继承DialogFragment的dialogF ...

  9. android fragment 弹出对话框,Android中使用Dialogfragment显示对话框

    其他注意事项: 1.如何设置自己的Dialogfragment没有标题栏? 可以通过两种方法来设置 ,一种是使用dialogfragment的setStyle函数,另外就是使用getDialog(). ...

  10. Android开发-弹出对话框

    配置 Androidmanifest.xml 中的配置 activity <activityandroid:name=".activity.yhsb.ShshDialogActivit ...

最新文章

  1. denied mysql permission_启动Mysql数据库报错误:-bash: ./start.sh: Permission denied
  2. 浅谈Time Elastic Band
  3. nginx报错The program 'nginx' can be found in the following packages
  4. Python(含PyCharm及配置)下载安装以及简单使用(Idea)
  5. java 数据源xml 展示到界面_ZK开发关键知识点
  6. U890第二次开发的BOM表工具--自主知识产权
  7. mysql 修改登录用户名和密码
  8. 计算线性回归、指数回归公式
  9. Power bi 3.18 仪表盘
  10. ubuntu中GoldenDict的使用
  11. Golang源码探索----GC的实现原理(3)
  12. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 (高斯消元)
  13. liquibase报错 waiting for changelog lock
  14. 计算机网络技术(五)——网络互联技术
  15. 行程码是怎么知道你去过哪些地方的呢?
  16. python文件.csv和.dta格式互转
  17. Vue状态管理器state(Vuex)
  18. 英伟达 amd linux 驱动下载,新版SteamO:新的NVIDIA/AMD驱动程序
  19. Docker搭建Redis主从模式
  20. 解决网页出现 net::ERR_ABORTED 404 (Not Found)问题

热门文章

  1. HDCP-新家庭影院网络场景的数字内容保护
  2. 苹果微信cookie传不到服务器,基于微信公共号开发遇到的cookie问题解决方案小记...
  3. P1878 舞蹈课(二叉堆)
  4. Reset、clock、locked和dcm_locked之间的坑
  5. 求解一元二次方程的根
  6. win7关机快捷键_150个常用的电脑快捷键,你都知道算我输
  7. TensorFlow2 学习——RNN生成古诗词
  8. 用迅雷下载百度网盘的文件
  9. html 播放ogg,HTML5中video 和 ogg
  10. 2014年domino学习小结