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生成的对话框,它的功能丰富、使用最广。

(0)

相关推荐

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

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

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

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

  • 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修改源码解决Alertdialog触摸对话框边缘消失的问题

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

  • 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单选按钮对话框用法实例分析

    本文实例讲述了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几种不同对话框的实现方式

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

  • 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对话框(Dialog)自定义集合

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

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

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

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

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

随机推荐