Android中Dialog简析

均属于笔记,仅供个人参考,有问题欢迎指正,整理模式

一,7种形式的Android Dialog使用举例

在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择。这些功能我们叫它Android Dialog对话框,在我们使用Android的过程中,我归纳了一下,Android Dialog的类型无非也就7种,下面我分别向大家介绍这7种Android Dialog对话框的使用方法,希望对大家能有所帮助。

1.该效果是当按返回按钮时弹出一个提示,来确保无误操作,采用常见的对话框样式。

创建dialog对话框方法代码如下:

创建dialog对话框方法代码如下:

protected void dialog() { 

    AlertDialog.Builder builder = new Builder(Main.this); 

    builder.setMessage("确认退出吗?"); 

    builder.setTitle("提示"); 

    builder.setPositiveButton("确认", new OnClickListener() { 

    @Override 

    public void onClick(DialogInterface dialog, int which) { 

      dialog.dismiss(); 

      Main.this.finish(); 

    } 

    }); 

    builder.setNegativeButton("取消", new OnClickListener() { 

    @Override 

    public void onClick(DialogInterface dialog, int which) { 

      dialog.dismiss(); 

    } 

    }); 

    builder.create().show(); 

   } 

在onKeyDown(int keyCode, KeyEvent event)方法中调用此方法

if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 

    dialog(); 

    } 

    return false; 

   } 

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

创建dialog的方法代码如下:

Dialog dialog = new AlertDialog.Builder(this).setIcon( 

      android.R.drawable.btn_star).setTitle("喜好调查").setMessage( 

      "你喜欢李连杰的电影吗?").setPositiveButton("很喜欢", 

      new OnClickListener() { 

        @Override 

        public void onClick(DialogInterface dialog, int which) { 

        // TODO Auto-generated method stub 

        Toast.makeText(Main.this, "我很喜欢他的电影。", 

          Toast.LENGTH_LONG).show(); 

        } 

      }).setNegativeButton("不喜欢", new OnClickListener() { 

      @Override 

      public void onClick(DialogInterface dialog, int which) { 

      // TODO Auto-generated method stub 

      Toast.makeText(Main.this, "我不喜欢他的电影。", Toast.LENGTH_LONG) 

        .show(); 

      } 

    }).setNeutralButton("一般", new OnClickListener() { 

      @Override 

      public void onClick(DialogInterface dialog, int which) { 

      // TODO Auto-generated method stub 

      Toast.makeText(Main.this, "谈不上喜欢不喜欢。", Toast.LENGTH_LONG) 

        .show(); 

      } 

    }).create(); 

    dialog.show(); 

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

创建dialog方法的代码如下:

new AlertDialog.Builder(this).setTitle("请输入").setIcon( 

      android.R.drawable.ic_dialog_info).setView( 

      new EditText(this)).setPositiveButton("确定", null) 

      .setNegativeButton("取消", null).show(); 

4.信息内容是一组单选框

创建dialog方法的代码如下:

new AlertDialog.Builder(this).setTitle("复选框").setMultiChoiceItems( 

      new String[] { "Item1", "Item2" }, null, null) 

      .setPositiveButton("确定", null) 

      .setNegativeButton("取消", null).show(); 

5.信息内容是一组多选框

创建dialog方法的代码如下:

new AlertDialog.Builder(this).setTitle("单选框").setIcon( 

      android.R.drawable.ic_dialog_info).setSingleChoiceItems( 

      new String[] { "Item1", "Item2" }, 0, 

      new DialogInterface.OnClickListener() { 

        public void onClick(DialogInterface dialog, int which) { 

        dialog.dismiss(); 

        } 

      }).setNegativeButton("取消", null).show(); 

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

创建dialog的方法代码如下:

new AlertDialog.Builder(this).setTitle("列表框").setItems( 

      new String[] { "Item1", "Item2" }, null).setNegativeButton( 

      "确定", null).show(); 

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

dialog布局文件代码如下:

<?xml version="1.0" encoding="utf-8"?> 


  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 

   android:layout_height="wrap_content" android:layout_width="wrap_content" 

   android:background="#ffffffff" android:orientation="horizontal" 

   android:id="@+id/dialog"> 

   <TextView android:layout_height="wrap_content" 

    android:layout_width="wrap_content" 

    android:id="@+id/tvname" android:text="姓名:" /> 

   <EditText android:layout_height="wrap_content" 

    android:layout_width="wrap_content" android:id="@+id/etname" android:minWidth="100dip"/> 

  </LinearLayout> 

创建dialog方法的代码如下:

LayoutInflater inflater = getLayoutInflater(); 

    View layout = inflater.inflate(R.layout.dialog, 

      (ViewGroup) findViewById(R.id.dialog)); 

    new AlertDialog.Builder(this).setTitle("自定义布局").setView(layout) 

      .setPositiveButton("确定", null) 

      .setNegativeButton("取消", null).show(); 

参考:http://blog.csdn.net/qq457163027/article/details/51192531

http://www.android100.org/html/201302/18/1611.html

二,小的知识点

1,create().show()和show()都可以是显示弹出框,两者的区别和联系:

没加create()时show()方法是AlertDialog.Builder类的show()方法;

加了create()方法后的show()方法是Dialog类的show()方法;

而AlertDialog.Builder类的show()方法如下:

AlertDialog.Builder.show()

{

AlertDialog dialog = create();

dialog.show();

return dialog;

}

AlertDialog.Builder类的show()方法里头自己有create()方法。

2,dialog.dismiss()方法的作用:

让dialog消失。

在builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int arg1) {

//有没有这行代码点击后弹出框都可以消失。

// dialog.dismiss();

}

});

三, Android自定义Dialog简单实例

做Android应用中,最缺少不了的就是自定义Dialog,对于系统默认提供的Dialog样式,一般都不复合我们应用的样式。

自定义Dialog需要3步骤即可:

1)、主要的重写Dialog的Java类

2)、自定义布局文件、并设置Dialog Theme,在style.xml文件中加一个即可

3)、使用方法

1、创建CustomPopDialog2.java类

import android.app.Dialog;

import android.content.Context;

import android.graphics.Bitmap;

import android.view.LayoutInflater;

import android.view.View;

import android.view.WindowManager.LayoutParams;

import android.widget.ImageView;

/**

* 该自定义Dialog应用在:弹出框居中显示图片,点击其他区域自动关闭Dialog

*/

public class CustomPopDialog2 extends Dialog {

    public CustomPopDialog2(Context context) {

        super(context);

    }

    public CustomPopDialog2(Context context, int theme) {

        super(context, theme);

    }

    public static class Builder {

        private Context context;

        private Bitmap image;

        public Builder(Context context) {

            this.context = context;

        }

        public Bitmap getImage() {

            return image;

        }

        public void setImage(Bitmap image) {

            this.image = image;

        }

        public CustomPopDialog2 create() {

            LayoutInflater inflater = (LayoutInflater) context

                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            final CustomPopDialog2 dialog = new CustomPopDialog2(context,R.style.Dialog);

            View layout = inflater.inflate(R.layout.dialog_share_qrcode, null);

            dialog.addContentView(layout, new LayoutParams(

                    android.view.ViewGroup.LayoutParams.WRAP_CONTENT

                    , android.view.ViewGroup.LayoutParams.WRAP_CONTENT));

            dialog.setContentView(layout);

            ImageView img = (ImageView)layout.findViewById(R.id.img_qrcode);

            img.setImageBitmap(getImage());

            return dialog;

        }

    }

}

这里简单说明下,我们自定义Dialog需要准备一个自己的View布局文件,主要关注create()方法即可,本例中就是直接显示一个图片。

2、自定义View的布局文件、并在style.xml中添加theme

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" android:gravity="center"

    android:id="@+id/rootLayout">

    <ImageView

        android:id="@+id/img_qrcode"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:contentDescription="二维码" />

</LinearLayout>

样式:

    <style name="Dialog" parent="android:style/Theme.Dialog">

        <item name="android:background">#00000000</item>

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

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

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

    </style>

3、使用自定义的Dialog

        Bitmap bitmap = xxxxx;// 这里是获取图片Bitmap,也可以传入其他参数到Dialog中

        CustomPopDialog2.Builder dialogBuild = new CustomPopDialog2.Builder(context);

        dialogBuild.setImage(bitmap);

        CustomPopDialog2 dialog = dialogBuild.create();

        dialog.setCanceledOnTouchOutside(true);// 点击外部区域关闭

        dialog.show();

参考:http://blog.csdn.net/catoop/article/details/50177147

http://blog.csdn.net/duanyanrui/article/details/8494767

四,Android--Dialog详细讲解

Dialog,对话框,一个对话框就是一个小窗口,并不会填满整个屏幕,通常是以模态显示,要求用户必须采取行动才能继续进行剩下的操作。

Android提供了丰富的对话框支持,它提供了如下4中常用的对话框:

AlertDialog:警告对话框,使用最广泛功能最丰富的一个对话框。

ProgressDialog:进度条对话框,只是对进度条进行了简单的封装。

DatePickerDialog:日期对话框。

TimePickerDialog:时间对话框。

所有的对话框,都是直接或间接继承自Dialog类,而AlterDialog直接继承自Dialog,其他的几个类均继承自AlterDialog。

参考:http://www.kwstu.com/ArticleView/kwstu_20139682354515

http://blog.csdn.net/liang5630/article/details/44098899

五,设置Dialog使返回键和点击外围失效(默认返回键和点击外围都可以使其消失)

1,对于AlertDialog.Builder(this)这种形式创建的Dialog

对于AlertDialog.Builder(this)这种形式创建的Dialog,只要new AlertDialog.Builder(this).setCancelable(false)这一行就可以使点击外围和返回键都失效。

2,对于AlertDialog dlg = new AlertDialog.Builder(this).create();先获取具体的Dialog的处理

dialog.setCancelable(false);这行代码也可以使返回键和点击外围失效。

Dialog的出现,很好的提升生了用户的用户体验,但是对于咱们程序猿来说,怎么样来好好的控制用户的误操作是个头疼问题啊,Dialog默认在按下返回键的时候会消失掉,那么如何让Dialog在用户按下返回键也不消失呢,方法是有的,毕竟Android是去过太空的,方法就是应该截取dialog的key响应事件,当dialog在前台显示的时候,keylistener首先会派发到dialog里面,在那里面监听就好了。

首先申请一个keylistener,在里面监听系统的按键,当然同样可以监听home键和其他的按键:

private OnKeyListener keylistener = new DialogInterface.OnKeyListener() { 

        public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 

            if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 

                return true; 

            } else { 

                return false; 

            } 

        } 

    }; 

然后在你创建Dialog的时候,将这个监听注册进去就哦了,方法如下:

AlertDialog dlg = new AlertDialog.Builder(this).create(); 

dlg.setOnKeyListener(keylistener); 

dlg.setCancelable(false); 

dlg.show(); 

其他的操作这里就不再累述,这样就算你按下返回,Dialog就不会消失了,PS: setCancelable(false),作用是当dialog弹出来的时候,如果触点在dialog外围,按照默认的方式 dialog将消失。如果这个设为false的话 这种情况dialog就不会消失了。  加了这一句就OK了 dialog.setCancelable(false);

参考:http://blog.csdn.net/LuckChouDog/article/details/42234801

六,Android界面之----自定义的Dialog,然后利用回调方法,在调用处,进行Dialog中各按钮的事件处理

public class LeaveMeetingDialog extends Dialog  implements OnClickListener{

    private Button  quitBtn,stopBtn,cancelBtn;

    private LeaveMeetingDialogListener listener;

    public interface LeaveMeetingDialogListener{

        public void onClick(View view);

    }

    public LeaveMeetingDialog(Context context,int theme,LeaveMeetingDialogListener listener) {

        super(context,theme);

    }

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.leave_meeting_dialog);

        initViews();

    }

    private void initViews(){

        quitBtn = (Button)findViewById(R.id.quit_btn);

        stopBtn = (Button)findViewById(R.id.stop_btn);

        cancelBtn = (Button)findViewById(R.id.cancel_btn);

        quitBtn.setOnClickListener(this);

        stopBtn.setOnClickListener(this);

        cancelBtn.setOnClickListener(this);

    }

    @Override

    public void onClick(View v) {

        listener.onClick(v);

    }

}

---调用处:

[java]

LeaveMeetingDialog  dialog = new LeaveMeetingDialog(this,R.style.Theme_CustomDialog,

            new LeaveMeetingDialogListener() {

        @Override

        public void onClick(View view) {

            switch(view.getId()){

                case R.id.quit_btn:break;

                case R.id.stop_btn:break;

                case R.id.cancel_btn:break;

            }

        }

});

      dialog.show();

参考:http://www.2cto.com/kf/201205/133945.html

七,显示弹出框后,后面界面不变暗

第一种是在样式文件styles.xml中添加新的样式,父样式指向的是默认的Dialog样式,修改如下,然后你的Dialog用你添加的样式就可以了.

<resources> 

    <style name="DialogStyle" parent="@android:style/Theme.Dialog"> 

        <!-- dialog背景样式 -->

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

        <!-- 背景透明 -->

        <item name="android:backgroundDimEnabled">false</item>    </style>     

</resources>

第二种是在代码中修改.lp.alpha大小随自己要求设置

// 设置屏幕背景变暗

private void setScreenBgDarken() {

WindowManager.LayoutParams lp = getWindow().getAttributes();

lp.alpha = 0.5f;

lp.dimAmount = 0.5f;

getWindow().setAttributes(lp);

}

// 设置屏幕背景变亮

private void setScreenBgLight() {

WindowManager.LayoutParams lp = getWindow().getAttributes();

lp.alpha = 1.0f;

lp.dimAmount = 1.0f;

getWindow().setAttributes(lp);

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容

  • 目录介绍 1.简单用法 2.AlertDialog源码分析2.1 AlertDialog.Builder的构造方法...
    杨充211阅读 1,026评论 1 1
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,199评论 0 17
  • 本人初学Android,最近做了一个实现安卓简单音乐播放功能的播放器,收获不少,于是便记录下来自己的思路与知识总结...
    落日柳风阅读 18,801评论 2 41
  • 0x000 环境: 系统:Win10 IDE:Android Studio2.0 0x002 简单使用 继承树:D...
    卖梳子的鲤鱼阅读 432评论 1 1
  • 今日打卡2:共计40分钟 本书完结 避免错误推理的陷阱固然重要,但我们还是应该花更多精力来领会逻辑思维的正确原则,...
    吟_f3da阅读 61评论 0 0