详解Android Dialog对话框的五种形式

Android中的对话框形式大致可分为五种:分别是一般对话框形式,列表对话框形式,单选按钮对话框,多选按钮对话框,自定义对话框。

在实际开发中,用系统的对话框会很少,因为太丑了,美工不愿意,多是使用自定义对话框。当然学会系统的,自定义就简单了,所以我们先来学习系统的,后面在写一篇自定义对话框。

一般对话框:

不多说先上图:

代码:

private void dialog1(){
  AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到构造器
  builder.setTitle("提示"); //设置标题
  builder.setMessage("是否确认退出?"); //设置内容
  builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
  builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { //设置确定按钮
   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss(); //关闭dialog
    Toast.makeText(MainActivity.this, "确认" + which, Toast.LENGTH_SHORT).show();
   }
  });
  builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { //设置取消按钮
   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();
    Toast.makeText(MainActivity.this, "取消" + which, Toast.LENGTH_SHORT).show();
   }
  }); 

  builder.setNeutralButton("忽略", new DialogInterface.OnClickListener() {//设置忽略按钮
   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();
    Toast.makeText(MainActivity.this, "忽略" + which, Toast.LENGTH_SHORT).show();
   }
  });
  //参数都设置完成了,创建并显示出来
  builder.create().show();
 }

说明:代码上注释已经比较全了,相信大家都能看得懂!dialog可以设置三个选择按钮,设置时指定按钮响应事件。
是不是觉得三个按钮写了三遍响应事件,很繁琐呢?注意:onClick的参数中有一个which,这个是什么意思呢?这个which实际上代表的是一个唯一的int型数值。像上面的setPositiveButton中的which代表的是-1,setNegativeButton中的which代表的是-3,setNeutralButton中的which代表的是-2.

到了这里相信大家已经想到怎么简洁的写法了,只要写一个响应事件,用which参数去区分是那个按钮就可以了!

看简洁的代码2:和上面的效果是一样的!

private void dialog1_1(){
  //先new出一个监听器,设置好监听
  DialogInterface.OnClickListener dialogOnclicListener=new DialogInterface.OnClickListener(){ 

   @Override
   public void onClick(DialogInterface dialog, int which) {
    switch(which){
     case Dialog.BUTTON_POSITIVE:
      Toast.makeText(MainActivity.this, "确认" + which, Toast.LENGTH_SHORT).show();
      break;
     case Dialog.BUTTON_NEGATIVE:
      Toast.makeText(MainActivity.this, "取消" + which, Toast.LENGTH_SHORT).show();
      break;
     case Dialog.BUTTON_NEUTRAL:
      Toast.makeText(MainActivity.this, "忽略" + which, Toast.LENGTH_SHORT).show();
      break;
    }
   }
  };
  //dialog参数设置
  AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到构造器
  builder.setTitle("提示"); //设置标题
  builder.setMessage("是否确认退出?"); //设置内容
  builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
  builder.setPositiveButton("确认",dialogOnclicListener);
  builder.setNegativeButton("取消", dialogOnclicListener);
  builder.setNeutralButton("忽略", dialogOnclicListener);
  builder.create().show();
 }

列表对话框:

代码:

private void dialog2() {
  final String items[]={"张三","李四","王五"};
  //dialog参数设置
  AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到构造器
  builder.setTitle("提示"); //设置标题
  //builder.setMessage("是否确认退出?"); //设置内容
  builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
  //设置列表显示,注意设置了列表显示就不要设置builder.setMessage()了,否则列表不起作用。
  builder.setItems(items,new DialogInterface.OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();
    Toast.makeText(MainActivity.this, items[which], Toast.LENGTH_SHORT).show(); 

   }
  });
  builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();
    Toast.makeText(MainActivity.this, "确定", Toast.LENGTH_SHORT).show();
   }
  });
  builder.create().show();
 }

说明:列表对话框只需设置Items属性即可,注意不能在设置Message属性,否则只会显示Message,不会显示列表。这里的setItems中的Onclick中的which属性是items数组的下标!

单选按钮对话框:

代码:

private void dialog3(){
  final String items[]={"男","女"};
  AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到构造器
  builder.setTitle("提示"); //设置标题
  builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
  builder.setSingleChoiceItems(items,0,new DialogInterface.OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
    //dialog.dismiss();
    Toast.makeText(MainActivity.this, items[which], Toast.LENGTH_SHORT).show();
   }
  });
  builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();
    Toast.makeText(MainActivity.this, "确定", Toast.LENGTH_SHORT).show();
   }
  });
  builder.create().show();
 }

说明:其实也没什么好说的,和上面的差不多,只是设置单选用setSingleChoiceItems,注意这里的参数:items是显示的文本,0表示默认选中是第一个,如图所示是默认选中“男”。

多选列表对话框:

代码:

private void dialog4(){
  final String items[]={"篮球","足球","排球"};
  final boolean selected[]={true,false,true};
  AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到构造器
  builder.setTitle("提示"); //设置标题
  builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
  builder.setMultiChoiceItems(items,selected,new DialogInterface.OnMultiChoiceClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which, boolean isChecked) {
    // dialog.dismiss();
    Toast.makeText(MainActivity.this, items[which]+isChecked, Toast.LENGTH_SHORT).show();
   }
  });
  builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();
    Toast.makeText(MainActivity.this, "确定", Toast.LENGTH_SHORT).show();
    //android会自动根据你选择的改变selected数组的值。
    for (int i=0;i<selected.length;i++){
     Log.e("hongliang",""+selected[i]);
    }
   }
  });
  builder.create().show();
 }

说明:setMultiChoiceItems中的参数:selected是默认的对应的选中状态。当你选择时,系统会自动帮你把selected中的值做相应改变,所以在确定按钮中可以得到所有的选择状态。其他和单选一样。

总结:要想更好的使用对话框,自定义对话框是少不了的,当然啦,要和activity通信,回调也是少不了的,后面会详细介绍。

不多说了,完整代码来一份:

MainActivity.java

package com.example.liang.dialogdemo; 

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast; 

public class MainActivity extends ActionBarActivity implements View.OnClickListener{
 private Button btn1;
 private Button btn2;
 private Button btn3;
 private Button btn4;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  btn1= (Button) findViewById(R.id.main_btn1);
  btn1.setOnClickListener(this);
  btn2= (Button) findViewById(R.id.main_btn2);
  btn2.setOnClickListener(this);
  btn3= (Button) findViewById(R.id.main_btn3);
  btn3.setOnClickListener(this);
  btn4= (Button) findViewById(R.id.main_btn4);
  btn4.setOnClickListener(this); 

 }
 private void dialog1(){
  AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到构造器
  builder.setTitle("提示"); //设置标题
  builder.setMessage("是否确认退出?"); //设置内容
  builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
  builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { //设置确定按钮
   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss(); //关闭dialog
    Toast.makeText(MainActivity.this, "确认" + which, Toast.LENGTH_SHORT).show();
   }
  });
  builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { //设置取消按钮
   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();
    Toast.makeText(MainActivity.this, "取消" + which, Toast.LENGTH_SHORT).show();
   }
  }); 

  builder.setNeutralButton("忽略", new DialogInterface.OnClickListener() {//设置忽略按钮
   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();
    Toast.makeText(MainActivity.this, "忽略" + which, Toast.LENGTH_SHORT).show();
   }
  });
  //参数都设置完成了,创建并显示出来
  builder.create().show();
 }
 private void dialog1_1(){
  //先new出一个监听器,设置好监听
  DialogInterface.OnClickListener dialogOnclicListener=new DialogInterface.OnClickListener(){ 

   @Override
   public void onClick(DialogInterface dialog, int which) {
    switch(which){
     case Dialog.BUTTON_POSITIVE:
      Toast.makeText(MainActivity.this, "确认" + which, Toast.LENGTH_SHORT).show();
      break;
     case Dialog.BUTTON_NEGATIVE:
      Toast.makeText(MainActivity.this, "取消" + which, Toast.LENGTH_SHORT).show();
      break;
     case Dialog.BUTTON_NEUTRAL:
      Toast.makeText(MainActivity.this, "忽略" + which, Toast.LENGTH_SHORT).show();
      break;
    }
   }
  };
  //dialog参数设置
  AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到构造器
  builder.setTitle("提示"); //设置标题
  builder.setMessage("是否确认退出?"); //设置内容
  builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
  builder.setPositiveButton("确认",dialogOnclicListener);
  builder.setNegativeButton("取消", dialogOnclicListener);
  builder.setNeutralButton("忽略", dialogOnclicListener);
  builder.create().show();
 }
 private void dialog2() {
  final String items[]={"张三","李四","王五"};
  //dialog参数设置
  AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到构造器
  builder.setTitle("提示"); //设置标题
  //builder.setMessage("是否确认退出?"); //设置内容
  builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
  //设置列表显示,注意设置了列表显示就不要设置builder.setMessage()了,否则列表不起作用。
  builder.setItems(items,new DialogInterface.OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();
    Toast.makeText(MainActivity.this, items[which], Toast.LENGTH_SHORT).show(); 

   }
  });
  builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();
    Toast.makeText(MainActivity.this, "确定", Toast.LENGTH_SHORT).show();
   }
  });
  builder.create().show();
 }
 private void dialog3(){
  final String items[]={"男","女"};
  AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到构造器
  builder.setTitle("提示"); //设置标题
  builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
  builder.setSingleChoiceItems(items,0,new DialogInterface.OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
    //dialog.dismiss();
    Toast.makeText(MainActivity.this, items[which], Toast.LENGTH_SHORT).show();
   }
  });
  builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();
    Toast.makeText(MainActivity.this, "确定", Toast.LENGTH_SHORT).show();
   }
  });
  builder.create().show();
 }
 private void dialog4(){
  final String items[]={"篮球","足球","排球"};
  final boolean selected[]={true,false,true};
  AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到构造器
  builder.setTitle("提示"); //设置标题
  builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
  builder.setMultiChoiceItems(items,selected,new DialogInterface.OnMultiChoiceClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which, boolean isChecked) {
    // dialog.dismiss();
    Toast.makeText(MainActivity.this, items[which]+isChecked, Toast.LENGTH_SHORT).show();
   }
  });
  builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();
    Toast.makeText(MainActivity.this, "确定", Toast.LENGTH_SHORT).show();
    //android会自动根据你选择的改变selected数组的值。
    for (int i=0;i<selected.length;i++){
     Log.e("hongliang",""+selected[i]);
    }
   }
  });
  builder.create().show();
 }
 @Override
 public void onClick(View v) {
  switch (v.getId()){
   case R.id.main_btn1:
    // dialog1();
    dialog1_1();//等同与上面的dialog1(),比之更简洁,推荐
    break;
   case R.id.main_btn2:
    dialog2();
    break;
   case R.id.main_btn3:
    dialog3();
    break;
   case R.id.main_btn4:
    dialog4();
    break;
  }
 }
}

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 android:paddingBottom="@dimen/activity_vertical_margin"
 android:paddingLeft="@dimen/activity_horizontal_margin"
 android:paddingRight="@dimen/activity_horizontal_margin"
 android:paddingTop="@dimen/activity_vertical_margin"
 tools:context=".MainActivity"> 

 <Button
  android:id="@+id/main_btn1"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="普通对话框" /> 

 <Button
  android:id="@+id/main_btn2"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="列表对话框" /> 

 <Button
  android:id="@+id/main_btn3"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="单选列表对话框" />
 <Button
  android:id="@+id/main_btn4"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="多选列表对话框" />
</LinearLayout>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 实例详解Android自定义ProgressDialog进度条对话框的实现

    Android SDK已经提供有进度条组件ProgressDialog组件,但用的时候我们会发现可能风格与我们应用的整体风格不太搭配,而且ProgressDialog的可定制行也不太强,这时就需要我们自定义实现一个ProgressDialog. 通过看源码我们发现,ProgressDialog继承自Alertdialog,有一个ProgressBar和两个TextView组成的,通过对ProgressDialog的源码进行改进就可以实现一个自定义的ProgressDialog. 1.效果: 首先

  • android 对话框弹出位置和透明度的设置具体实现方法

    例如,屏幕的上方或下方.要实现这种效果.就需要获得对话框的Window对象,获得这个Window对象有多种方法.最容易的就是直接通过AlertDialog类的getWindow方法来获得Window对象. 复制代码 代码如下: AlertDialog dialog = new AlertDialog.Builder(this).setTitle("title")                       .setMessage("message").create(

  • Android修改源码解决Alertdialog触摸对话框边缘消失的问题

    研究其父类时候发现,可以设置这么一条属性,在AlertDialog.Builder.create()之后才能调用这两个方法 方法一: setCanceledOnTouchOutside(false);调用这个方法时,按对话框以外的地方不起作用.按返回键还起作用 方法二: setCanceleable(false);调用这个方法时,按对话框以外的地方不起作用.按返回键也不起作用 这两个方法都属于Dialog方法,可查阅源码 修改后的源码如下: 复制代码 代码如下: case 1:         

  • Android实现点击AlertDialog上按钮时不关闭对话框的方法

    本文实例讲述了Android实现点击AlertDialog上按钮时不关闭对话框的方法.分享给大家供大家参考.具体如下: 开发过程中,有时候会有这样的需求: 点击某个按钮之后显示一个对话框,对话框上面有一个输入框,并且有"确认"和"取消"两个按钮.当用户点击确认按钮时,需要对输入框的内容进行判断.如果内容为空则不关闭对话框,并toast提示. 使用AlertDialog.Builder创建对话框时,可以使用builder.setNegativeButton和build

  • Android中自定义对话框(Dialog)的实例代码

    1.修改系统默认的Dialog样式(风格.主题) 2.自定义Dialog布局文件 3.可以自己封装一个类,继承自Dialog或者直接使用Dialog类来实现,为了方便以后重复使用,建议自己封装一个Dialog类 第一步: 我们知道Android定义个控件或View的样式都是通过定义其style来实现的,查看Android框架中的主题文件,在源码中的路径:/frameworks/base/core/res/res/values/themes.xml,我们可以看到,Android为Dialog定义了

  • Android加载对话框同时异步执行实现方法

    Android中通过子线程连接网络获取资料,同时显示加载进度对话框给用户的操作,需要Thread和Handler来完成,在Thread中执行比较耗时的代码,完成后再通过Handler发送消息给主线程,由主线程刷新UI. 在实现上比较的烦琐,为简化此方法,花了点时间封装了Thread和Handler,现在通过简单的代码就可以实现相同的功能,而把更多精力放到业务逻辑处理上! 效果如图:   复制代码 代码如下: LoadingDialog loadingDialog = new LoadingDia

  • Android中创建一个透明的进度对话框实例

    首先我们看一下什么叫做透明的进度对话框: 接下来我们讲一下如何创建:1.使用Eclipse创建一个新的Andr​​oid 项目,使用Android 2.2或以上.2.在/res/layout文件夹,创建线性布局activity_main.xml文件,主要是为了添加一个文本标签和一个按钮 复制代码 代码如下: activity_main.xml<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&quo

  • Android中 动态改变对话框值的方法

    使用方法是这样的,Activity.showDialog()激发Activity.onCreateDialog()创建Dialog,然后显示之,便于多个Dialog的统一管理. 注意,以后再用Activity.showDialog()显示同一个Dialog时,则不会调用Activity.onCreateDialog(), 而是调用Activity.onPrepareDialog(),使用上一次显示Dialog时的状态.即 第一次:showDialog() -> onCreatedialog() 

  • Android中AlertDialog各种对话框的用法实例详解

    目标效果: 程序运行,显示图一的几个按钮,点击按钮分别显示图二到图六的对话框,点击对话框的某一项或者按钮,也会显示相应的吐司输出. 1.activity_main.xml页面存放五个按钮. activity_main.xml页面: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools&

  • Android使用setCustomTitle()方法自定义对话框标题

    Android有自带的对话框标题,但是不太美观,如果要给弹出的对话框设置一个自定义的标题,使用AlertDialog.Builder的setCustomTitle()方法. 运行效果如下,左边是点击第一个按钮,弹出Android系统自带的对话框(直接用setTitle()设置标题):右边是点击第二个按钮,首先inflate一个View,然后用setCustomTitle()方法把该View设置成对话框的标题. 定义一个对话框标题的title.xml文件: <?xml version="1.

随机推荐