Android开发必知 九种对话框的实现方法

在开发过程中,与用户交互式免不了会用到对话框以实现更好的用户体验,所以掌握几种对话框的实现方法还是非常有必要的。在看具体实例之前先对AlertDialog做一个简单介绍。AlertDialog是功能最丰富、实践应用最广的对话框,它可以生成各种内容的对话框。但实际上AlertDialog生成的对话框总体可分为以下4个区域:图标区、标题区、内容区、按钮区。

这里总结了九种对话框的实现方法,有需要的朋友可以来学习下了

除了popupwindow实现稍微麻烦一点,其他形似都相对简单,熟悉2便即可

直接上源码

package com.naoh.stu;
import java.util.ArrayList;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.PopupWindow;
import android.widget.Toast;
public class DiaAllActivity extends Activity implements Runnable {
  private Button btn_diaNormal;
  private Button btn_diaMulti;
  private Button btn_diaList;
  private Button btn_diaSinChos;
  private Button btn_diaMultiChos;
  private Button btn_diaProcess;
  private Button btn_diaReadProcess;
  private Button btn_diaCustom;
  private Button btn_popUpDia;
  private PopupWindow window=null;
  private Button cusPopupBtn1;
  private View popupView;
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.dialog);
    getView();
    setListener();
  }
  private void getView()
  {
    btn_diaNormal=(Button)findViewById(R.id.btn_diaNormal);
    btn_diaMulti=(Button)findViewById(R.id.btn_diaMulti);
    btn_diaList=(Button)findViewById(R.id.btn_diaList);
    btn_diaSinChos=(Button)findViewById(R.id.btn_diaSigChos);
    btn_diaMultiChos=(Button)findViewById(R.id.btn_diaMultiChos);
    btn_diaProcess=(Button)findViewById(R.id.btn_diaProcess);
    btn_diaReadProcess=(Button)findViewById(R.id.btn_diaReadProcess);
    btn_diaCustom=(Button)findViewById(R.id.btn_diaCustom);
    btn_popUpDia=(Button)findViewById(R.id.btn_popUpDia);
  }
  private void setListener()
  {
    btn_diaNormal.setOnClickListener(btnListener);
    btn_diaMulti.setOnClickListener(btnListener);
    btn_diaList.setOnClickListener(btnListener);
    btn_diaSinChos.setOnClickListener(btnListener);
    btn_diaMultiChos.setOnClickListener(btnListener);
    btn_diaProcess.setOnClickListener(btnListener);
    btn_diaReadProcess.setOnClickListener(btnListener);
    btn_diaCustom.setOnClickListener(btnListener);
    btn_popUpDia.setOnClickListener(btnListener);
  }
  private Button.OnClickListener btnListener= new Button.OnClickListener()
  {
    public void onClick(View v)
    {
      if(v instanceof Button)
      {
        int btnId=v.getId();
        switch(btnId)
        {
          case R.id.btn_diaNormal:
            showNormalDia();
            break;
          case R.id.btn_diaMulti:
            showMultiDia();
            break;
          case R.id.btn_diaList:
            showListDia();
            break;
          case R.id.btn_diaSigChos:
            showSinChosDia();
            break;
          case R.id.btn_diaMultiChos:
            showMultiChosDia();
            break;
          case R.id.btn_diaReadProcess:
            showReadProcess();
            break;
          case R.id.btn_diaProcess:
            showProcessDia();
            break;
          case R.id.btn_diaCustom:
            showCustomDia();
            break;
          case R.id.btn_popUpDia:
            showCusPopUp(v);
            break;
          default:
            break;
        }
      }
    }
  };
  /*普通的对话框*/
  private void showNormalDia()
  {
    //AlertDialog.Builder normalDialog=new AlertDialog.Builder(getApplicationContext());
    AlertDialog.Builder normalDia=new AlertDialog.Builder(DiaAllActivity.this);
    normalDia.setIcon(R.drawable.ic_launcher);
    normalDia.setTitle("普通的对话框");
    normalDia.setMessage("普通对话框的message内容");
    normalDia.setPositiveButton("确定", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
        // TODO Auto-generated method stub
        showClickMessage("确定");
      }
    });
    normalDia.setNegativeButton("取消", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
        // TODO Auto-generated method stub
        showClickMessage("取消");
      }
    });
    normalDia.create().show();
  }
  /*多按钮对话框*/
  private void showMultiDia()
  {
    AlertDialog.Builder multiDia=new AlertDialog.Builder(DiaAllActivity.this);
    multiDia.setTitle("多选项对话框");
    multiDia.setPositiveButton("按钮一", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
        // TODO Auto-generated method stub
        showClickMessage("按钮一");
      }
    });
    multiDia.setNeutralButton("按钮二", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
        // TODO Auto-generated method stub
        showClickMessage("按钮二");
      }
    });
    multiDia.setNegativeButton("按钮三", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
        // TODO Auto-generated method stub
        showClickMessage("按钮三");
      }
    });
    multiDia.create().show();
  }
  /*列表对话框*/
  private void showListDia()
  {
    final String[] mList={"选项1","选项2","选项3","选项4","选项5","选项6","选项7"};
    AlertDialog.Builder listDia=new AlertDialog.Builder(DiaAllActivity.this);
    listDia.setTitle("列表对话框");
    listDia.setItems(mList, new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
        // TODO Auto-generated method stub
        /*下标是从0开始的*/
        showClickMessage(mList[which]);
      }
    });
    listDia.create().show();
  }
  /*单项选择对话框*/
  int yourChose=-1;
  private void showSinChosDia()
  {
    final String[] mList={"选项1","选项2","选项3","选项4","选项5","选项6","选项7"};
    yourChose=-1;
    AlertDialog.Builder sinChosDia=new AlertDialog.Builder(DiaAllActivity.this);
    sinChosDia.setTitle("单项选择对话框");
    sinChosDia.setSingleChoiceItems(mList, 0, new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
        // TODO Auto-generated method stub
        yourChose=which;
      }
    });
    sinChosDia.setPositiveButton("确定", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
        // TODO Auto-generated method stub
        if(yourChose!=-1)
        {
          showClickMessage(mList[yourChose]);
        }
      }
    });
    sinChosDia.create().show();
  }
  ArrayList<Integer> myChose= new ArrayList<Integer>();
  private void showMultiChosDia()
  {
    final String[] mList={"选项1","选项2","选项3","选项4","选项5","选项6","选项7"};
    final boolean mChoseSts[]={false,false,false,false,false,false,false};
    myChose.clear();
    AlertDialog.Builder multiChosDia=new AlertDialog.Builder(DiaAllActivity.this);
    multiChosDia.setTitle("多项选择对话框");
    multiChosDia.setMultiChoiceItems(mList, mChoseSts, new DialogInterface.OnMultiChoiceClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which, boolean isChecked) {
        // TODO Auto-generated method stub
        if(isChecked)
        {
          myChose.add(which);
        }
        else
        {
          myChose.remove(which);
        }
      }
    });
    multiChosDia.setPositiveButton("确定", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
        // TODO Auto-generated method stub
        int size=myChose.size();
        String str="";
        for(int i=0;i<size;i++)
        {
          str+=mList[myChose.get(i)];
        }
        showClickMessage(str);
      }
    });
    multiChosDia.create().show();
  }
  //进度读取框需要模拟读取
  ProgressDialog mReadProcessDia=null;
  public final static int MAX_READPROCESS = 100;
  private void showReadProcess()
  {
    mReadProcessDia=new ProgressDialog(DiaAllActivity.this);
    mReadProcessDia.setProgress(0);
    mReadProcessDia.setTitle("进度条窗口");
    mReadProcessDia.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    mReadProcessDia.setMax(MAX_READPROCESS);
    mReadProcessDia.show();
    new Thread(this).start();
  }
  //新开启一个线程,循环的累加,一直到100然后在停止
  @Override
  public void run()
  {
    int Progress= 0;
    while(Progress < MAX_READPROCESS)
    {
      try {
        Thread.sleep(100);
        Progress++;
        mReadProcessDia.incrementProgressBy(1);
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
    //读取完了以后窗口自消失
    mReadProcessDia.cancel();
  }
  /*读取中的对话框*/
  private void showProcessDia()
  {
    ProgressDialog processDia= new ProgressDialog(DiaAllActivity.this);
    processDia.setTitle("进度条框");
    processDia.setMessage("内容读取中...");
    processDia.setIndeterminate(true);
    processDia.setCancelable(true);
    processDia.show();
  }
  /*自定义对话框*/
  private void showCustomDia()
  {
    AlertDialog.Builder customDia=new AlertDialog.Builder(DiaAllActivity.this);
    final View viewDia=LayoutInflater.from(DiaAllActivity.this).inflate(R.layout.custom_dialog, null);
    customDia.setTitle("自定义对话框");
    customDia.setView(viewDia);
    customDia.setPositiveButton("确定", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
        // TODO Auto-generated method stub
        EditText diaInput=(EditText) viewDia.findViewById(R.id.txt_cusDiaInput);
        showClickMessage(diaInput.getText().toString());
      }
    });
    customDia.create().show();
  }
  /*popup window 来实现*/
  private void showCusPopUp(View parent)
  {
    if(window == null)
    {
      popupView=LayoutInflater.from(DiaAllActivity.this).inflate(R.layout.dia_cuspopup_dia, null);
      cusPopupBtn1=(Button)popupView.findViewById(R.id.diaCusPopupSure);
      window =new PopupWindow(popupView,LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);
    }
    window.setAnimationStyle(R.style.PopupAnimation);
    /*必须调用setBackgroundDrawable, 因为popupwindow在初始时,会检测background是否为null,如果是onTouch or onKey events就不会相应,所以必须设置background*/
    /*网上也有很多人说,弹出pop之后,不响应键盘事件了,这个其实是焦点在pop里面的view去了。*/
    window.setFocusable(true);
    window.setBackgroundDrawable(new BitmapDrawable());
    window.update();
    window.showAtLocation(parent, Gravity.CENTER_VERTICAL, 0, 0);
    cusPopupBtn1.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        showClickMessage("popup window的确定");
      }
    });
  }
  /*显示点击的内容*/
  private void showClickMessage(String message)
  {
    Toast.makeText(DiaAllActivity.this, "你选择的是: "+message, Toast.LENGTH_SHORT).show();
  }
} 

布局,就是一堆的button

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical" >
  <TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="各种Dialog合集" />
  <Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="普通Dialog"
    android:id="@+id/btn_diaNormal"/>
  <Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="多按钮Dialog"
    android:id="@+id/btn_diaMulti"/>
  <Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="列表Dialog"
    android:id="@+id/btn_diaList"/>
  <Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="单项选择Dialog"
    android:id="@+id/btn_diaSigChos"/>
  <Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="多项选择Dialog"
    android:id="@+id/btn_diaMultiChos"/>
  <Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="进度条Dialog"
    android:id="@+id/btn_diaReadProcess"/>
  <Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="读取中Dialog"
    android:id="@+id/btn_diaProcess"/>
  <Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="自定义Dialog"
    android:id="@+id/btn_diaCustom"/>
  <Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="PopUpWindow实现的dialog"
    android:id="@+id/btn_popUpDia"/>
</LinearLayout> 

以上是Android开发必知 九种对话框的实现方法,代码主要用AlertDialog生成的对话框,它的功能丰富、使用最广。

时间: 2015-08-10

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单选按钮对话框用法.分享给大家供大家参考.具体如下: main.xml布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:l

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

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

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

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

android几种不同对话框的实现方式

app中肯定是少不了与用户交互的各种dialog,下面给大家介绍几种提示框的提示. 一般创建一个对话框需要经过以下几步: 1.创建AlertDialog.Builder对象. 2.调用AlertDialog.Builder的setTitle()或者setCustomTitle()方法设置标题. 3.调用AlertDialog.Builder的setIcon()方法设置标题logo. 4.调用AlertDialog.Builder的相关方法设置对话框内容. 5.调用AlertDialog.Buil

属于自己的Android对话框(Dialog)自定义集合

Activities提供了一种方便管理的创建.保存.回复的对话框机制,例如 onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog(int), dismissDialog(int)等方法,如果使用这些方法的话,Activity将通过getOwnerActivity()方法返回该Activity管理的对话框(dialog). onCreateDialog(int):当你使用这个回调函数时,Android系统会有效的设置这个Acti

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&

8种android 对话框(Dialog)使用方法详解

本文汇总了android 8种对话框(Dialog)使用方法,分享给大家供大家参考,具体内容如下 1.写在前面 Android提供了丰富的Dialog函数,本文介绍最常用的8种对话框的使用方法,包括普通(包含提示消息和按钮).列表.单选.多选.等待.进度条.编辑.自定义等多种形式,将在第2部分介绍. 有时,我们希望在对话框创建或关闭时完成一些特定的功能,这需要复写Dialog的create().show().dismiss()等方法,将在第3部分介绍. 2.代码示例 2.1 普通Dialog(图

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

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

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

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

Android编程之交互对话框实例浅析

本文实例讲述了Android编程之交互对话框.分享给大家供大家参考,具体如下: 1. 在Android SDK中,虽然有许多的窗口,有些类似Modeless的窗口.有些类似于前端Force Focus的窗口,但真正具有交互功能的则为AlertDialog对话窗口. new AlertDialog.Builder(EX03_12.this) .setTitle(R.string.app_about) .setMessage(R.string.app_about_msg) .setPositiveB

Android编程双重单选对话框布局实现与事件监听方法示例

本文实例讲述了Android编程双重单选对话框布局实现与事件监听方法.分享给大家供大家参考,具体如下: 首先是自定义XML布局代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_pare

Android编程之消息机制实例分析

本文实例讲述了Android编程之消息机制.分享给大家供大家参考,具体如下: 一.角色描述 1.Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列). 2.Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里:或者接收Looper(从Message Queue取出)所送来的消息. 3. Message Queue(消息队列):用来存放线程放入的消息. 4.线程:UI thr

Android编程ViewPager回弹效果实例分析

本文实例讲述了Android编程ViewPager回弹效果.分享给大家供大家参考,具体如下: 其实在我们很多应用中都看到当ViewPager滑到第一页或者最后一页的时候,如果再滑动的时候,就会有一个缓冲的过程,也就是回弹效果.之前在研究回弹效果的时候,也顺便实现了ViewPager的回弹效果,其实也很简单,一下是实现代码,注释比较少: package com.freesonfish.viewpager_2; import android.content.Context; import andro

Android编程之动态壁纸实例分析

本文实例讲述了Android编程之动态壁纸.分享给大家供大家参考,具体如下: 从android 2.1版本起引入了动态壁纸的概念,熟悉android的人一定不会陌生.这里解释一个动态壁纸是怎么形成又是怎么工作的. 首先动态桌面的动态体现出这个组件是实时变化的,也就是说有一个后台在不停的刷新这个组件.联想到后台组件首先想到的就是service,从代码角度看,果然如此.每一个动态桌面都继承自WallpaperService,其中必须实现的抽象方法onCreateEngine,返回一个Engine对象

Android编程之蓝牙测试实例

本文实例讲述了Android编程之蓝牙测试.分享给大家供大家参考.具体分析如下: 一.软件平台: win7 + eclipse + sdk 二.设计思路: 配合倒计时定时器实现蓝牙打开,可见,扫描三个功能 三.源代码: main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/re

Android编程实现3D旋转效果实例

本文实例讲述了Android编程实现3D旋转效果的方法.分享给大家供大家参考,具体如下: 下面的示例是在Android中实现图片3D旋转的效果. 实现3D效果一般使用OpenGL,但在Android平台下可以不直接使用OpenGL,而是使用Camera实现,Camera中原理最终还是使用OpenGL,不过使用Camera比较方便. Camera类似一个摄像机,当物体不动时,我们带着摄像机四处移动,在摄像机里面的画面就会有立体感,就可以从其它的角度观看这个物体.废话不多说,直接看示例. 运行效果如

Android编程之监听器用法实例分析

本文实例讲述了Android编程之监听器用法.分享给大家供大家参考,具体如下: 这里通过监听内容提供者数据变化和监听发送短信进行讲解监听器.如果用户提供者数据发生了变化,监听器立刻就能收到对数据库操作的记录,而监听器是采用通知的机制,如果不采用通知的机制也可以做,那就是不断的查询数据库,这样的话效率就会很低.而采用通知机制的话,当用户向数据库发送一条记录,ContentObserver立刻就能获取到,我们就可以进行处理数据. 监听内容提供者数据的变化 1.在内容提供者中可以通知其他程序数据发生变

Android编程之控件状态配置文件实例

本文实例讲述了Android编程之控件状态配置文件.分享给大家供大家参考,具体如下: <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 无状态时 --> <item android:state_focused="false" android:state_selected="false" android:state_pr

Android编程获取网络时间实例分析

本文实例讲述了Android编程获取网络时间的方法.分享给大家供大家参考,具体如下: 在网上看到的最常见的方式有: public static void main(String[] args) throws Exception { URL url=new URL("http://www.bjtime.cn");//取得资源对象 URLConnection uc=url.openConnection();//生成连接对象 uc.connect(); //发出连接 long ld=uc.g