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布局文件代码如下:

 


  

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

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

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

  

    android:layout_width="wrap_content" 

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

  

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

   

创建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

    android:layout_width="match_parent"

    android:layout_height="match_parent"

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

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

   

        android:id="@+id/img_qrcode"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:contentDescription="二维码" />

样式:

   

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用你添加的样式就可以了.

 

         

第二种是在代码中修改.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);

}

你可能感兴趣的:(Android中Dialog简析)