Android中dialog的使用

来源:互联网 发布:left软件安卓版 编辑:程序博客网 时间:2024/05/21 21:44

在android 中提到dialog相信大家都不陌生,开发中经常用到的一个类,个人认为在android开发中dialog和popupwindow使用上有很多共性,后者的操作性应该更强些。。。

        Dialog类,是一切对话框的基类,需要注意的是,Dialog类虽然可以在界面上显示,但是并非继承于View类,而是直接从java.lang.Object开始构造出的。类似于Activity,Dialog也是有生命周期的,它的生命周期由Activity来维护。Activity负责生成、保存、恢复它。在生命周期的每一个阶段都有一些回调函数供系统反向调用。
ShowDialog(int id):负责显示标示为id的Dialog,这个函数如果调用后,系统将反向调用Dialog的回调函数onCreateDialog(int id);
dismissDialog(int id):使标示为id的Dialog在界面当中消。

        AlertDialog是Dialog的一个直接子类,一个AlertDialog可以有两个Button或者3个Button,可以对一个AlertDialog设置title、message。不能直接通过AlertDialog的构造函数来生成一个AlertDialog,一般生成的时候都是通过它的的一个内部静态类AlertDialog.Builder来构造的。

在开发中,经常会在界面上弹出一些对话框,以达到与用户良好的交互及体验感。比如询问用户或者让用户选择,这些功能我们叫它Android Dialog对话框,从大体上来说,

可归为7类:

1.最普通的用法就弹出一个基本的提示对话框,通常以起到提示的作用

通过图片可以看到,在这种情况下的对话框可看成被分为上下两个部分,上部分是对话框的title部分,下面的message部分,其实是细分还有其他部分

①图片区       ②标题区      ③内容区④按钮区


  1. AlertDialog.Builder builder = new AlertDialog.Builder(this)
  2. .setIcon(R.mipmap.ic_launcher) //设置对话框的图标,可不写
  3. .setTitle("对话框") //设置对话框的标题,可不写
  4. .setMessage("消息体") //设置对话框的消息体,可不写 ,如果都不写,这对话框只会显示一个暗灰色的效果
  5. .setCancelable(false); //设置点击对话框以外区域及返回键是否消失
  6. builder.create().show();

如果只是设置点击对话框以外区域不消失,则可通过设置alertdialog的setCanceledOnTouchOutside(false);


  1. AlertDialog.Builder builder = new AlertDialog.Builder(this)
  2. .setIcon(R.mipmap.ic_launcher)
  3. .setTitle("对话框")
  4. .setMessage("消息体")
  5. .setNegativeButton("确定", new DialogInterface.OnClickListener() {
  6. @Override
  7. public void onClick(DialogInterface dialog, int which) {
  8. //点击确定操作
  9. }
  10. })
  11. .setPositiveButton("取消", new DialogInterface.OnClickListener() {
  12. @Override
  13. public void onClick(DialogInterface dialog, int which) {
  14. //点击取消操作
  15. }
  16. })
  17. .setCancelable(false);
  18. builder.create().show();

2.改变了对话框的图表,添加了三个按钮


  1. AlertDialog.Builder builder = new AlertDialog.Builder(this)
  2. .setIcon(R.mipmap.ic_launcher)
  3. .setTitle("对话框")
  4. .setMessage("消息体")
  5. .setNegativeButton("喜欢", new DialogInterface.OnClickListener() {
  6. @Override
  7. public void onClick(DialogInterface dialog, int which) {
  8. //点击确定操作
  9. }
  10. })
  11. .setPositiveButton("不喜欢", new DialogInterface.OnClickListener() {
  12. @Override
  13. public void onClick(DialogInterface dialog, int which) {
  14. //点击取消操作
  15. }
  16. })
  17. .setNeutralButton("一般", new DialogInterface.OnClickListener() {
  18. @Override
  19. public void onClick(DialogInterface dialog, int which) {
  20. //点击一般操作
  21. }
  22. })
  23. .setCancelable(false);
  24. builder.create().show();

3.信息内容是一个简单的View类型


  1. AlertDialog.Builder builder = new AlertDialog.Builder(this)
  2. .setIcon(R.mipmap.ic_launcher)
  3. .setTitle("对话框")
  4. .setMessage("消息体")
  5. .setView(new EditText(this))
  6. .setNegativeButton("确定", new DialogInterface.OnClickListener() {
  7. @Override
  8. public void onClick(DialogInterface dialog, int which) {
  9. //点击确定操作
  10. }
  11. })
  12. .setPositiveButton("取消", new DialogInterface.OnClickListener() {
  13. @Override
  14. public void onClick(DialogInterface dialog, int which) {
  15. //点击取消操作
  16. }
  17. })
  18. .setCancelable(false);
  19. builder.create().show();
4.信息内容是单选框


  1. AlertDialog.Builder builder = new AlertDialog.Builder(this)
  2. .setIcon(R.mipmap.ic_launcher)
  3. .setTitle("单选框")
  4. .setSingleChoiceItems(new String[]{"itme1", "item2"}, 0, new DialogInterface.OnClickListener() {
  5. @Override
  6. public void onClick(DialogInterface dialog, int which) {
  7. //单击item操作
  8. }
  9. })
  10. .setNegativeButton("确定", new DialogInterface.OnClickListener() {
  11. @Override
  12. public void onClick(DialogInterface dialog, int which) {
  13. //点击确定操作
  14. }
  15. })
  16. .setPositiveButton("取消", new DialogInterface.OnClickListener() {
  17. @Override
  18. public void onClick(DialogInterface dialog, int which) {
  19. //点击取消操作
  20. }
  21. })
  22. .setCancelable(false);
  23. builder.create().show();
5.信息内容是多选框


  1. AlertDialog.Builder builder = new AlertDialog.Builder(this)
  2. .setIcon(R.mipmap.ic_launcher)
  3. .setTitle("单选框")
  4. .setMultiChoiceItems(new String[]{"item1", "item2", "item3"}, new boolean[]{false, true, false}, new DialogInterface.OnMultiChoiceClickListener() {
  5. @Override
  6. public void onClick(DialogInterface dialog, int which, boolean isChecked) {
  7. //单击item操作
  8. }
  9. })
  10. .setNegativeButton("确定", new DialogInterface.OnClickListener() {
  11. @Override
  12. public void onClick(DialogInterface dialog, int which) {
  13. //点击确定操作
  14. }
  15. })
  16. .setPositiveButton("取消", new DialogInterface.OnClickListener() {
  17. @Override
  18. public void onClick(DialogInterface dialog, int which) {
  19. //点击取消操作
  20. }
  21. })
  22. .setCancelable(false);
  23. builder.create().show();
这里说下复选框的setMultiChoiceItems的方法,对于此方法的第二个参数是设置默认状态下选中的item,如例子中第二个item给选中


6.信息内容是一组简单列表项



  1. AlertDialog.Builder builder = new AlertDialog.Builder(this)
  2. .setIcon(R.mipmap.ic_launcher)
  3. .setTitle("列表项")
  4. .setItems(new String[]{"item1", "item2"}, new DialogInterface.OnClickListener() {
  5. @Override
  6. public void onClick(DialogInterface dialog, int which) {
  7. //单击item操作
  8. }
  9. });
  10. builder.create().show();
列表项的对话框相对前几项就简单些,单击item后对话框就消失了

7.信息内容是一个自定义的布局

本项跟第3项就很相似了,只是转换了布局而已,使用的是自定义的view


布局文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="horizontal" android:layout_width="match_parent"
  4. android:layout_height="wrap_content">
  5. <TextView
  6. android:text="输入框:"
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content" />
  9. <EditText
  10. android:layout_weight="1"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content" />
  13. </LinearLayout>
  14. View view = getLayoutInflater().inflate(R.layout.dialog_view, null);
  15. AlertDialog.Builder builder = new AlertDialog.Builder(this)
  16. .setIcon(R.mipmap.ic_launcher)
  17. .setTitle("自定义view")
  18. .setView(view)
  19. .setPositiveButton("确定", new DialogInterface.OnClickListener() {
  20. @Override
  21. public void onClick(DialogInterface dialog, int which) {
  22. //单击确定操作
  23. }
  24. })
  25. .setNegativeButton("取消", new DialogInterface.OnClickListener() {
  26. @Override
  27. public void onClick(DialogInterface dialog, int which) {
  28. //单机取消操作
  29. }
  30. });
  31. builder.create().show();

以上只是基础使用,默认弹出的提示框位置固定了,如果想修改

  1. AlertDialog alertDialog = builder.create();  
  2.         alertDialog.setCanceledOnTouchOutside(false);           //设置点击其他地方不让其消失  
  3.         Window mWindow = alertDialog.getWindow();  
  4.         WindowManager.LayoutParams lp = mWindow.getAttributes();  
  5.         // 透明度的范围为:0.0f-1.0f;0.0f表示完全透明,1.0f表示完全不透明(系统默认的就是这个)。  
  6.         lp.alpha = 0.35f;  
  7.         //设置对话框在屏幕的底部显示,当然还有上下左右,任意位置  
  8.         //mWindow.setGravity(Gravity.LEFT);  
  9. //        mWindow.setGravity(Gravity.BOTTOM);  
  10.         /*  
  11.         *  
  12.         * 这里是设置偏移量,这里的x,y并不是相对于屏幕的绝对坐标,而是相对于对话框在中心位置(默认的对话框一般显示在屏幕的中心)而言的  
  13.         *  */  
  14.         lp.x = -20;// 设置水平偏移量  
  15.         lp.y = 300;// 设置竖直偏移量  
  16.         // 设置Window的属性  
  17.         mWindow.setAttributes(lp); 

对于取消提示框可用dismiss或者cancel,难么两者的区别呢?

查看源码会发现cancel内部调用了dismiss...


Android API 支持下列类型的对话框对象:
  警告对话框 AlertDialog:  一个可以有0到3个按钮, 一个单选框或复选框的列表的对话框. 警告对话框可以创建大多数的交互界面, 是推荐的类型.
  进度对话框 ProgressDialog:  显示一个进度环或者一个进度条. 由于它是AlertDialog的扩展, 所以它也支持按钮.
  日期选择对话框 DatePickerDialog:  让用户选择一个日期.
  时间选择对话框 TimePickerDialog:  让用户选择一个时间.
  如果你希望自定义你的对话框, 可以扩展Dialog类.


使用过程中还有完全自定义的dialog  

下面我提供一个自定义的   边框圆形



Layout文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical" android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@drawable/register_dialog_bg">    <TextView        android:layout_width="match_parent"        android:layout_height="40dp"        android:gravity="center"        android:text="提示"        android:textColor="@android:color/black"        android:textSize="17sp"/>    <TextView        android:layout_width="match_parent"        android:layout_height="40dp"        android:layout_marginTop="5dp"        android:gravity="center"        android:text="测试中"        android:textColor="@android:color/black"        android:textSize="15sp"/>    <View        android:layout_width="match_parent"        android:layout_height="1dp"        android:background="#d0d0d0"        android:layout_marginTop="5dp"/>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="50dp"        android:orientation="horizontal">        <TextView            android:id="@+id/tv_cancel"            android:layout_width="0dp"            android:layout_weight="1"            android:layout_height="match_parent"            android:text="取消"            android:textColor="@android:color/black"            android:textSize="15sp"            android:gravity="center"/>        <View            android:layout_width="1dp"            android:layout_height="match_parent"            android:background="#d0d0d0"/>        <TextView            android:id="@+id/tv_confirm"            android:layout_width="0dp"            android:layout_weight="1"            android:layout_height="match_parent"            android:text="确定"            android:textColor="@android:color/black"            android:textSize="15sp"            android:gravity="center"/>    </LinearLayout></LinearLayout>
shape文件

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android">        <solid android:color="#ffffffff" />        <!--<stroke android:width="5dp" android:color="@android:color/black"/>-->        <corners android:radius="20dp" />        <padding android:left="3dp" android:top="3dp"            android:right="3dp" android:bottom="3dp" /></shape>
style文件

  1. <style name="Dialog">
  2. <item name="android:windowBackground">@android:color/transparent</item>
  3. <item name="android:windowNoTitle">true</item>
  4. <item name="android:windowFrame">@null</item>
  5. <item name="android:windowIsFloating">true</item>
  6. <item name="android:windowContentOverlay">@null</item>
  7. <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
  8. <item name="android:windowIsTranslucent">true</item>
  9. <item name="android:backgroundDimEnabled">true</item>
  10. </style>
代码

final Dialog dialog = new Dialog(this, R.style.Dialog);dialog.setCancelable(false);View view = LayoutInflater.from(this).inflate(R.layout.dialog, null);dialog.setContentView(view);TextView tvCancel = (TextView) view.findViewById(R.id.tv_cancel);TextView tvConfirm = (TextView) view.findViewById(R.id.tv_confirm);tvCancel.setOnClickListener(new View.OnClickListener() {    @Override    public void onClick(View v) {        dialog.cancel();    }});tvConfirm.setOnClickListener(new View.OnClickListener() {    @Override    public void onClick(View v) {        dialog.dismiss();    }});dialog.show();
对于以上详细讲解下

<item name="android:windowFrame">@null</item>//Dialog的windowFrame框为无

<item name="android:windowIsFloating">true</item>//是否浮现在activity之上

<item name="android:windowIsTranslucent">true</item> //是否半透明

<item name="android:windowNoTitle">true</item>//是否显示title

<item name="android:windowBackground">@android:color/transparent</item>

<item name="android:backgroundDimEnabled">true</item>

要想自定义一个正常的圆角的dialog,就要注意设置其windowBackground的属性是透明的,然后自己画的shape设置corners


常用方法

①setMessage():设置简单的文本

②setItems():设置对话框内容为简单列表项

③setSingleChoiceItems()设置对话框内容为单选列表项

④setMultiChoiceItems():设置对话框内容为多选列表项

⑤setAdapter():设置对话框内容为自定义列表项

⑤setView():设置对话框的内容为自定义View


以上讲解完!欢迎大家交流学习





0 0
原创粉丝点击