精华内容
下载资源
问答
  • AlertDialog

    千次阅读 2012-10-09 20:00:06
    Android的AlertDialog详解  AlertDialog的构造方法全部是Protected的,所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。 要创建一个AlertDialog,就要用到AlertDialog.Builder中的create...
    Android的AlertDialog详解   


    AlertDialog的构造方法全部是Protected的,所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。

    要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法。

    使用AlertDialog.Builder创建对话框需要了解以下几个方法:

    setTitle :为对话框设置标题
    setIcon :为对话框设置图标
    setMessage:为对话框设置内容
    setView : 给对话框设置自定义样式
    setItems :设置对话框要显示的一个list,一般用于显示几个命令时
    setMultiChoiceItems :用来设置对话框显示一系列的复选框
    setNeutralButton    :普通按钮

    setPositiveButton   :给对话框添加"Yes"按钮
    setNegativeButton :对话框添加"No"按钮
    create : 创建对话框
    show :显示对话框
    一、简单的AlertDialog

    下面,创建一个简单的ALertDialog并显示它:

    public class Dialog_AlertDialogDemoActivity extends Activity {
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      Dialog alertDialog = new AlertDialog.Builder(this).
        setTitle("对话框的标题").
        setMessage("对话框的内容").
        setIcon(R.drawable.ic_launcher).
        create();
      alertDialog.show();
     }
    }运行结果如下:

     \

     


    二、带按钮的AlertDialog

    上面的例子很简单,下面我们在这个AlertDialog上面加几个Button,实现删除操作的提示对话框

    public class Dialog_AlertDialogDemoActivity extends Activity {
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      Dialog alertDialog = new AlertDialog.Builder(this).
        setTitle("确定删除?").
        setMessage("您确定删除该条信息吗?").
        setIcon(R.drawable.ic_launcher).
        setPositiveButton("确定", new DialogInterface.OnClickListener() {
         
         @Override
         public void onClick(DialogInterface dialog, int which) {
          // TODO Auto-generated method stub
         }
        }).
        setNegativeButton("取消", new DialogInterface.OnClickListener() {
         
         @Override
         public void onClick(DialogInterface dialog, int which) {
          // TODO Auto-generated method stub
         }
        }).
        setNeutralButton("查看详情", new DialogInterface.OnClickListener() {
         
         @Override
         public void onClick(DialogInterface dialog, int which) {
          // TODO Auto-generated method stub
         }
        }).
        create();
      alertDialog.show();
     }
    }在这个例子中,我们定义了三个按钮,分别是"Yes"按钮,"No"按钮以及一个普通按钮,每个按钮都有onClick事件,TODO的地方可以放点了按钮之后想要做的一些处理

    看一下运行结果:

     \


    可以看到三个按钮添加到了AlertDialog上,三个没有添加事件处理的按钮,点了只是关闭对话框,没有任何其他操作。

     

     

    三、类似ListView的AlertDialog
    用setItems(CharSequence[] items, final OnClickListener listener)方法来实现类似ListView的AlertDialog

    第一个参数是要显示的数据的数组,第二个参数是点击某个item的触发事件

    public class Dialog_AlertDialogDemoActivity extends Activity {
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      final String[] arrayFruit = new String[] { "苹果", "橘子", "草莓", "香蕉" };

      Dialog alertDialog = new AlertDialog.Builder(this).
        setTitle("你喜欢吃哪种水果?").
        setIcon(R.drawable.ic_launcher)
        .setItems(arrayFruit, new DialogInterface.OnClickListener() {
     
         @Override
         public void onClick(DialogInterface dialog, int which) {
          Toast.makeText(Dialog_AlertDialogDemoActivity.this, arrayFruit[which], Toast.LENGTH_SHORT).show();
         }
        }).
        setNegativeButton("取消", new DialogInterface.OnClickListener() {

         @Override
         public void onClick(DialogInterface dialog, int which) {
          // TODO Auto-generated method stub
         }
        }).
        create();
      alertDialog.show();
     }
    }运行结果如下:

     \

     

     

     

    四、类似RadioButton的AlertDialog
    用setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener)方法来实现类似RadioButton的AlertDialog

    第一个参数是要显示的数据的数组,第二个参数是初始值(初始被选中的item),第三个参数是点击某个item的触发事件

    在这个例子里面我们设了一个selectedFruitIndex用来记住选中的item的index

    public class Dialog_AlertDialogDemoActivity extends Activity {
     
     private int selectedFruitIndex = 0;
     
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      final String[] arrayFruit = new String[] { "苹果", "橘子", "草莓", "香蕉" };

      Dialog alertDialog = new AlertDialog.Builder(this).
        setTitle("你喜欢吃哪种水果?").
        setIcon(R.drawable.ic_launcher)
        .setSingleChoiceItems(arrayFruit, 0, new DialogInterface.OnClickListener() {
     
         @Override
         public void onClick(DialogInterface dialog, int which) {
          selectedFruitIndex = which;
         }
        }).
        setPositiveButton("确认", new DialogInterface.OnClickListener() {

         @Override
         public void onClick(DialogInterface dialog, int which) {
          Toast.makeText(Dialog_AlertDialogDemoActivity.this, arrayFruit[selectedFruitIndex], Toast.LENGTH_SHORT).show();
         }
        }).
        setNegativeButton("取消", new DialogInterface.OnClickListener() {

         @Override
         public void onClick(DialogInterface dialog, int which) {
          // TODO Auto-generated method stub
         }
        }).
        create();
      alertDialog.show();
     }
    }

    运行结果如下:

     \

     


    五、类似CheckBox的AlertDialog
    用setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems, final OnMultiChoiceClickListener listener)方法来实现类似CheckBox的AlertDialog
    第一个参数是要显示的数据的数组,第二个参数是选中状态的数组,第三个参数是点击某个item的触发事件

    public class Dialog_AlertDialogDemoActivity extends Activity {
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      final String[] arrayFruit = new String[] { "苹果", "橘子", "草莓", "香蕉" };
      final boolean[] arrayFruitSelected = new boolean[] {true, true, false, false};

      Dialog alertDialog = new AlertDialog.Builder(this).
        setTitle("你喜欢吃哪种水果?").
        setIcon(R.drawable.ic_launcher)
        .setMultiChoiceItems(arrayFruit, arrayFruitSelected, new DialogInterface.OnMultiChoiceClickListener() {
         
         @Override
         public void onClick(DialogInterface dialog, int which, boolean isChecked) {
          arrayFruitSelected[which] = isChecked;
         }
        }).
        setPositiveButton("确认", new DialogInterface.OnClickListener() {

         @Override
         public void onClick(DialogInterface dialog, int which) {
          StringBuilder stringBuilder = new StringBuilder();
          for (int i = 0; i < arrayFruitSelected.length; i++) {
           if (arrayFruitSelected[i] == true)
           {
            stringBuilder.append(arrayFruit[i] + "、");
           }
          }
          Toast.makeText(Dialog_AlertDialogDemoActivity.this, stringBuilder.toString(), Toast.LENGTH_SHORT).show();
         }
        }).
        setNegativeButton("取消", new DialogInterface.OnClickListener() {

         @Override
         public void onClick(DialogInterface dialog, int which) {
          // TODO Auto-generated method stub
         }
        }).
        create();
      alertDialog.show();
     }
    }运行结果如下:

     \

     

     

    六、自定义View的AlertDialog
    有时候我们不能满足系统自带的AlertDialog风格,就比如说我们要实现一个Login画面,有用户名和密码,这时我们就要用到自定义View的AlertDialog

    先创建Login画面的布局文件

    [html] <?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" > 
     
        <LinearLayout 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content" 
            android:gravity="center" > 
     
            <TextView 
                android:layout_width="0dip" 
                android:layout_height="wrap_content" 
                android:layout_weight="1" 
                android:text="@string/user" /> 
     
            <EditText 
                android:layout_width="0dip" 
                android:layout_height="wrap_content" 
                android:layout_weight="1" /> 
        </LinearLayout> 
     
        <LinearLayout 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content" 
            android:gravity="center" > 
     
            <TextView 
                android:layout_width="0dip" 
                android:layout_height="wrap_content" 
                android:layout_weight="1" 
                android:text="@string/passward" /> 
     
            <EditText 
                android:layout_width="0dip" 
                android:layout_height="wrap_content" 
                android:layout_weight="1" /> 
        </LinearLayout> 
     
    </LinearLayout> 
    <?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" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center" >

            <TextView
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/user" />

            <EditText
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center" >

            <TextView
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/passward" />

            <EditText
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1" />
        </LinearLayout>

    </LinearLayout>
    然后在Activity里面把Login画面的布局文件添加到AlertDialog上

    [java] package com.tianjf; 
     
    import android.app.Activity; 
    import android.app.AlertDialog; 
    import android.app.Dialog; 
    import android.content.DialogInterface; 
    import android.os.Bundle; 
    import android.view.LayoutInflater; 
    import android.view.View; 
     
    public class Dialog_AlertDialogDemoActivity extends Activity { 
        /** Called when the activity is first created. */ 
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.main); 
     
            // 取得自定义View  
            LayoutInflater layoutInflater = LayoutInflater.from(this); 
            View myLoginView = layoutInflater.inflate(R.layout.login, null); 
             
            Dialog alertDialog = new AlertDialog.Builder(this). 
                    setTitle("用户登录"). 
                    setIcon(R.drawable.ic_launcher). 
                    setView(myLoginView). 
                    setPositiveButton("登录", new DialogInterface.OnClickListener() { 
     
                        @Override 
                        public void onClick(DialogInterface dialog, int which) { 
                            // TODO Auto-generated method stub  
                        } 
                    }). 
                    setNegativeButton("取消", new DialogInterface.OnClickListener() { 
     
                        @Override 
                        public void onClick(DialogInterface dialog, int which) { 
                            // TODO Auto-generated method stub  
                        } 
                    }). 
                    create(); 
            alertDialog.show(); 
        } 

    public class Dialog_AlertDialogDemoActivity extends Activity {
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      // 取得自定义View
      LayoutInflater layoutInflater = LayoutInflater.from(this);
      View myLoginView = layoutInflater.inflate(R.layout.login, null);
      
      Dialog alertDialog = new AlertDialog.Builder(this).
        setTitle("用户登录").
        setIcon(R.drawable.ic_launcher).
        setView(myLoginView).
        setPositiveButton("登录", new DialogInterface.OnClickListener() {

         @Override
         public void onClick(DialogInterface dialog, int which) {
          // TODO Auto-generated method stub
         }
        }).
        setNegativeButton("取消", new DialogInterface.OnClickListener() {

         @Override
         public void onClick(DialogInterface dialog, int which) {
          // TODO Auto-generated method stub
         }
        }).
        create();
      alertDialog.show();
     }
    }运行结果如下:

     \


    摘要: 创建对话框 一个对话框一般是一个出现在当前Activity之上的一个小窗口. 处于下面的Activity失去焦点, 对话框接受所有的用户交互. 对话框一般用于提示信息和与当前应用程序直接相关的小功能.Android API 支持下列类型 ...
    创建对话框
      一个对话框一般是一个出现在当前Activity之上的一个小窗口. 处于下面的Activity失去焦点, 对话框接受所有的用户交互. 对话框一般用于提示信息和与当前应用程序直接相关的小功能.
      Android API 支持下列类型的对话框对象:
      警告对话框 AlertDialog:  一个可以有0到3个按钮, 一个单选框或复选框的列表的对话框. 警告对话框可以创建大多数的交互界面, 是推荐的类型.
      进度对话框 ProgressDialog:  显示一个进度环或者一个进度条. 由于它是AlertDialog的扩展, 所以它也支持按钮.
      日期选择对话框 DatePickerDialog:  让用户选择一个日期.
      时间选择对话框 TimePickerDialog:  让用户选择一个时间.
      如果你希望自定义你的对话框, 可以扩展Dialog类.
      Showing a Dialog 显示对话框
      一个对话框总是被创建和显示为一个Activity的一部分. 你应该在Activity的onCreateDialog(int)中创建对话框. 当你使用这个回调函数时,Android系统自动管理每个对话框的状态并将它们和Activity连接, 将Activity变为对话框的"所有者". 这样,每个对话框从Activity继承一些属性. 例如,当一个对话框打开时, MENU键会显示Activity的菜单, 音量键会调整Activity当前使用的音频流的音量.
      注意: 如果你希望在onCreateDialog()方法之外创建对话框, 它将不会依附在Activity上. 你可以使用setOwnerActivity(Activity)来将它依附在Activity上.
      当你希望显示一个对话框时, 调用showDialog(int)并将对话框的id传给它.
      当一个对话框第一次被请求时,Android调用onCreateDialog(int). 这里是你初始化对话框的地方. 这个回调函数传入的id和showDialog(int)相同. 创建对话框之后,将返回被创建的对象.
      在对话框被显示之前,Android还会调用onPrepareDialog(int, Dialog). 如果你希望每次显示对话框时有动态更改的内容, 那么就改写这个函数. 该函数在每次一个对话框打开时都调用. 如果你不定义该函数,则对话框每次打开都是一样的. 该函数也会传入对话框的id以及你在onCreateDialog()中创建的Dialog对象.
      最好的定义onCreateDialog(int) 和onPrepareDialog(int, Dialog) 的方法就是使用一个switch语句来检查传入的id. 每个case创建相应的对话框. 例如, 一个游戏使用两个对话框: 一个来指示游戏暂停,另一个指示游戏结束. 首先, 为它们定义ID:static final int DIALOG_PAUSED_ID = 0;
    static final int DIALOG_GAMEOVER_ID = 1; 
    然后, 在onCreateDialog(int)中加入一个switch语句:
    1. protected Dialog onCreateDialog(int id) {  
    2.     Dialog dialog;  
    3.     switch(id) {  
    4.     case DIALOG_PAUSED_ID:  
    5.         // do the work to define the pause Dialog  
    6.         break;  
    7.     case DIALOG_GAMEOVER_ID:  
    8.         // do the work to define the game over Dialog  
    9.         break;  
    10.     default:  
    11.         dialog = null;  
    12.     }  
    13.     return dialog;  
    14. }   
      注意: 在这个例子中, case语句为空因为定义Dialog的程序在后面会有介绍.
      在需要显示对话框是, 调用showDialog(int), 传入对话框的id:
      showDialog(DIALOG_PAUSED_ID);Dismissing a Dialog 解除对话框
      当你准备关闭对话框时, 你可以使用dismiss()函数. 如果需要的话, 你也可以从Activity调用dismissDialog(int), 二者效果是一样的.
      如果你使用onCreateDialog(int)来管理你的对话框的状态, 那么每次你的对话框被解除时, 该对话框对象的状态会被Activity保存. 如果你决定你不再需要这个对象或者需要清除对话框的状态, 那么你应该调用 removeDialog(int). 这将把所有该对象的内部引用移除, 如果该对话框在显示的话将被解除.
      Using dismiss listeners 使用解除监听器
      如果你希望在对话框解除时运行某些程序, 那么你应该给对话框附加一个解除监听器.
      首先定义DialogInterface.OnDismissListener接口. 这个接口只有一个方法, onDismiss(DialogInterface), 该方法将在对话框解除时被调用.
      然后将你的OnDismissListener实现传给setOnDismissListener().
      然而,注意对话框也可以被"取消". 这是一个特殊的情形, 它意味着对话框被用户显式的取消掉. 这将在用户按下"back"键时, 或者对话框显式的调用cancel()(按下对话框的cancel按钮)时发生. 当一个对话框被取消时, OnDismissListener将仍然被通知, 但如果你希望在对话框被显示取消(而不是正常解除)时被通知, 则你应该使用setOnCancelListener()注册一个DialogInterface.OnCancelListener.
      Creating an AlertDialog 创建警告对话框
      An AlertDialog is an extension of the Dialog class. It is capable of constructing most dialog user interfaces and is the suggested dialog type. You should use it for dialogs that use any of the following features:
      一个警告对话框是对话框的一个扩展. 它能够创建大多数对话框用户界面并且是推荐的对话框类新星. 对于需要下列任何特性的对话框,你都应该使用它:
      一个标题
      一条文字消息
      1个-3个按钮
      一个可选择的列表(单选框或者复选框)
      要创建一个AlertDialog, 使用AlertDialog.Builder子类. 使用AlertDialog.Builder(Context)来得到一个Builder, 然后使用该类的公有方法来定义AlertDialog的属性. 设定好以后, 使用create()方法来获得AlertDialog对象.
      下面的主题展示了如何为AlertDialog定义不同的属性, 使用AlertDialog.Builder类. 如果你使用这些示例代码, 你可以在onCreateDialog()中返回最后的Dialog对象来获得图片中对话框的效果.
      Adding buttons 增加按钮
    要创建一个如图所示的窗口, 使用set...Button()方法:
    1. AlertDialog.Builder builder = new AlertDialog.Builder(this);  
    2. builder.setMessage("Are you sure you want to exit?")  
    3.        .setCancelable(false)  
    4.        .setPositiveButton("Yes"new DialogInterface.OnClickListener() {  
    5.            public void onClick(DialogInterface dialog, int id) {  
    6.                 MyActivity.this.finish();  
    7.            }  
    8.        })  
    9.        .setNegativeButton("No"new DialogInterface.OnClickListener() {  
    10.            public void onClick(DialogInterface dialog, int id) {  
    11.                 dialog.cancel();  
    12.            }  
    13.        });  
    14. AlertDialog alert = builder.create();  
    首先,使用setMessage(CharSequence)为对话框增加一条消息。 然后, 开始连续调用方法, 使用setCancelable(boolean)将对话框设为不可取消(不能使用back键来取消)。对每一个按钮,使用set...Button()方法,该方法接受按钮名称和一个DialogInterface.OnClickListener,该监听器定义了当用户选择该按钮时应做的动作。
      注意:对每种按钮类型,只能为AlertDialog创建一个。也就是说,一个AlertDialog不能有两个以上的"positive"按钮。这使得可能的按钮数量最多为三个:肯定、否定、中性。这些名字和实际功能没有联系,但是将帮助你记忆它们各做什么事情。
    Adding a list 增加列表
    要创建一个具有可选项的AlertDialog,使用setItems()方法:
    1. final CharSequence[] items = {"Red""Green""Blue"};   
    2. AlertDialog.Builder builder = new AlertDialog.Builder(this);  
    3. builder.setTitle("Pick a color");  
    4. builder.setItems(items, new DialogInterface.OnClickListener() {  
    5.     public void onClick(DialogInterface dialog, int item) {  
    6.         Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();  
    7.     }  
    8. });  
    9. AlertDialog alert = builder.create();  
    首先增加一个标题。然后使用setItems()增加一个可选列表,该列表接受一个选项名称的列表和一个DialogInterface.OnClickListener, 后者定义了选项对应的响应。

    Adding checkboxes and radio buttons 增加单选框和复选框
     
    要创建一个带有多选列表或者单选列表的对话框, 使用setMultiChoiceItems()和setSingleChoiceItems()方法。如果你在onCreateDialog()中创建可选择列表, Android会自动管理列表的状态. 只要activity仍然活跃, 那么对话框就会记住刚才选中的选项,但当用户退出activity时,该选择丢失。
      注意: 要在你的acitivity离开和暂停时保存选择, 你必须在activity的声明周期中正确的保存和恢复设置。为了永久性保存选择,你必须使用数据存储技术中的一种。
      要创建一个具有单选列表的AlertDialog,只需将一个例子中的setItems()换成 setSingleChoiceItems():
    1. final CharSequence[] items = {"Red""Green""Blue"};   
    2. AlertDialog.Builder builder = new AlertDialog.Builder(this);  
    3. builder.setTitle("Pick a color");  
    4. builder.setSingleChoiceItems(items, -1new DialogInterface.OnClickListener() {  
    5.     public void onClick(DialogInterface dialog, int item) {  
    6.         Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();  
    7.     }  
    8. });  
    9. AlertDialog alert = builder.create();  
    第二个参数是默认被选中的选项位置,使用“-1”来表示默认情况下不选中任何选项。

    Creating a ProgressDialog 创建进度对话框
    一个ProgressDialog(进度对话框)是AlertDialog的扩展。它可以显示一个进度的动画――进度环或者进度条。这个对话框也可以提供按钮,例如取消一个下载等。
      打开一个进度对话框很简单,只需要调用 ProgressDialog.show()即可。例如,上图的对话框可以不通过onCreateDialog(int),而直接显示:
      ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "",
      "Loading. Please wait...", true);
      第一个参数是应用程序上下文。第二个为对话框的标题(这里为空),第三个为对话框内容, 最后一个为该进度是否为不可确定的(这只跟进度条的创建有关,见下一节)。
      进度对话框的默认样式为一个旋转的环。如果你希望显示进度值,请看下一节。
      Showing a progress bar 显示进度条
      使用一个动画进度条来显示进度:
      使用 ProgressDialog(Context)构造函数来初始化一个ProgressDialog对象。
      将进度样式设置为"STYLE_HORIZONTAL",使用setProgressStyle(int)方法。并且设置其它属性,例如内容等。
      在需要显示时调用show()或者从onCreateDialog(int)回调函数中返回该ProgressDialog。
      你可以使用 setProgress(int)或者incrementProgressBy(int)来增加显示的进度。
      例如,你的设置可能像这样:ProgressDialog progressDialog;
    progressDialog = new ProgressDialog(mContext);
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    progressDialog.setMessage("Loading...");
    progressDialog.setCancelable(false);
      设置很简单。大部分创建进度对话框需要的代码是在更新它的进程中。你可能需要在一个新的线程中更新它,并使用Handler来将进度报告给Activity。如果你不熟悉使用Handler和另外的线程,请看下列例子,该例子使用了一个新的线程来更新进度。
      Example ProgressDialog with a second thread 例--使用一个线程来显示进度对话框
      这个例子使用一个线程来跟踪一个进程的进度(其实为从1数到100)。每当进度更新时,该线程通过Handler给主activity发送一个消息。主Activity更新ProgressDialog.package com.example.progressdialog;
    1. import android.app.Activity;  
    2. import android.app.Dialog;  
    3. import android.app.ProgressDialog;  
    4. import android.os.Bundle;  
    5. import android.os.Handler;  
    6. import android.os.Message;  
    7. import android.view.View;  
    8. import android.view.View.OnClickListener;  
    9. import android.widget.Button;  
    10. public class NotificationTest extends Activity {  
    11.     static final int PROGRESS_DIALOG = 0;  
    12.     Button button;  
    13.     ProgressThread progressThread;  
    14.     ProgressDialog progressDialog;  
    15.     /** Called when the activity is first created. */  
    16.     public void onCreate(Bundle savedInstanceState) {  
    17.         super.onCreate(savedInstanceState);  
    18.         setContentView(R.layout.main);   
    19.         // Setup the button that starts the progress dialog  
    20.         button = (Button) findViewById(R.id.progressDialog);  
    21.         button.setOnClickListener(new OnClickListener(){  
    22.             public void onClick(View v) {  
    23.                 showDialog(PROGRESS_DIALOG);  
    24.             }  
    25.         });  
    26.     }  
    27.     protected Dialog onCreateDialog(int id) {  
    28.         switch(id) {  
    29.         case PROGRESS_DIALOG:  
    30.             progressDialog = new ProgressDialog(NotificationTest.this);  
    31.             progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);  
    32.             progressDialog.setMessage("Loading...");  
    33.             progressThread = new ProgressThread(handler);  
    34.             progressThread.start();  
    35.             return progressDialog;  
    36.         default:  
    37.             return null;  
    38.         }  
    39.     }   
    40.     // Define the Handler that receives messages from the thread and update the progress  
    41.     final Handler handler = new Handler() {  
    42.         public void handleMessage(Message msg) {  
    43.             int total = msg.getData().getInt("total");  
    44.             progressDialog.setProgress(total);  
    45.             if (total >= 100){  
    46.                 dismissDialog(PROGRESS_DIALOG);  
    47.                 progressThread.setState(ProgressThread.STATE_DONE);  
    48.             }  
    49.         }  
    50.     };   
    51.     /** Nested class that performs progress calculations (counting) */  
    52.     private class ProgressThread extends Thread {  
    53.         Handler mHandler;  
    54.         final static int STATE_DONE = 0;  
    55.         final static int STATE_RUNNING = 1;  
    56.         int mState;  
    57.         int total;  
    58.         ProgressThread(Handler h) {  
    59.             mHandler = h;  
    60.         }  
    61.         public void run() {  
    62.             mState = STATE_RUNNING;     
    63.             total = 0;  
    64.             while (mState == STATE_RUNNING) {  
    65.                 try {  
    66.                     Thread.sleep(100);  
    67.                 } catch (InterruptedException e) {  
    68.                     Log.e("ERROR""Thread Interrupted");  
    69.                 }  
    70.                 Message msg = mHandler.obtainMessage();  
    71.                 Bundle b = new Bundle();  
    72.                 b.putInt("total", total);  
    73.                 msg.setData(b);  
    74.                 mHandler.sendMessage(msg);  
    75.                 total++;  
    76.             }  
    77.         }  
    78.         /* sets the current state for the thread, 
    79.          * used to stop the thread */  
    80.         public void setState(int state) {  
    81.             mState = state;  
    82.         }  
    83.     }  
    84. }  
    Creating a Custom Dialog 创建自定义对话框
    如果你想自定义一个对话框,你可以使用布局元素来创造你的对话框的布局。定义好布局后,将根View对象或者布局资源ID传给setContentView(View).
    例如,创建如图所示的对话框:
    创建一个xml布局custom_dialog.xml:
    1. http://schemas.android.com/apk/res/android"  
    2.               android:id="@+id/layout_root"  
    3.               android:orientation="horizontal"  
    4.               android:layout_width="fill_parent"  
    5.               android:layout_height="fill_parent"  
    6.               android:padding="10dp"  
    7.               >  
    8.                    android:layout_width="wrap_content"  
    9.                android:layout_height="fill_parent"  
    10.                android:layout_marginRight="10dp"  
    11.                />  
    12.                   android:layout_width="wrap_content"  
    13.               android:layout_height="fill_parent"  
    14.               android:textColor="#FFF"  
    15.               />  
    该xml定义了一个LinearLayout中的一个ImageView 和一个TextView。
    将以上布局设为对话框的content view,并且定义ImageView 和 TextView的内容:
    1. Context mContext = getApplicationContext();  
    2. Dialog dialog = new Dialog(mContext);   
    3. dialog.setContentView(R.layout.custom_dialog);  
    4. dialog.setTitle("Custom Dialog");  
    5. TextView text = (TextView) dialog.findViewById(R.id.text);  
    6. text.setText("Hello, this is a custom dialog!");  
    7. ImageView image = (ImageView) dialog.findViewById(R.id.image);  
    8. image.setImageResource(R.drawable.android);  
    在初始化Dialog之后,使用setContentView(int),将布局资源id传给它。现在Dialog有一个定义好的布局,你可以使用findViewById(int)来找到该元素的id并修改它的内容。
      使用前面所讲的方法显示对话框。
      一个使用Dialog类建立的对话框必须有一个标题。如果你不调用setTitle(),那么标题区域会保留空白。如果你不希望有一个标题,那么你应该使用AlertDialog类来创建自定义对话框。然而,由于一个AlertDialog使用AlertDialog.Builder类来建立最方便,所以你没有方法使用setContentView(int),而是只能使用setView(View)。该方法接受一个View对象,所以你需要从xml中展开你的根View。
      要展开一个xml布局,使用 getLayoutInflater() (或 getSystemService())取得LayoutInflater,然后调用inflate(int, ViewGroup),第一个参数为布局id,而第二个参数为根view的id。现在,你可以使用展开后的布局来找到View对象并定义ImageView和TextView元素的内容。然后实例化AlertDialog.Builder并使用setView(View)来为对话框设置展开后的布局。例如:
    1. AlertDialog.Builder builder;  
    2. AlertDialog alertDialog;   
    3. Context mContext = getApplicationContext();  
    4. LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);  
    5. View layout = inflater.inflate(R.layout.custom_dialog,  
    6.                                (ViewGroup) findViewById(R.id.layout_root));  
    7. TextView text = (TextView) layout.findViewById(R.id.text);  
    8. text.setText("Hello, this is a custom dialog!");  
    9. ImageView image = (ImageView) layout.findViewById(R.id.image);  
    10. image.setImageResource(R.drawable.android);  
    11. builder = new AlertDialog.Builder(mContext);  
    12. builder.setView(layout);  
    13. alertDialog = builder.create();  
    使用AlertDialog来自定义对话框,可以利用其内置特性例如按钮、选择列表、标题、图标等。


    显示对话框

        对话框经常作为Activity的一部分来创建和显示。你通常应该从protected Dialog Activity.onCreateDialog (int id) 回调方法里创建对话框。当你使用这个回调函数时,Android系统会有效的设置这个Activity为每个对话框的所有者,从而自动管理每个对话框的状态并挂靠到Activity上。这样,每个对话框继承这个Activity的特定属性。比如,当一个对话框打开时,菜单键显示为这个Activity定义的选项菜单,音量键修改Activity使用的音频流

    1. 注意: 如果你决定在onCreateDialog()方法之外创建一个对话框,它将不会被附着到活动上。不过,你可以通过setOwnerActivity(Activity)把它附着到一个活动上。 

        当你想要显示一个对话框时,调用showDialog(int id) 方法并传递一个唯一标识这个对话框的整数。

        当对话框第一次被请求时,Android从你的Activity中调用onCreateDialog(int id),你应该在这里初始化这个对话框Dialog。这个回调方法被传以和showDialog(int id)相同的ID。当你创建这个对话框后,在Activity的最后返回这个对象。

        在对话框被显示之前,Android还调用了可选的回调函数onPrepareDialog(int id, Dialog). 如果你想在每一次对话框被打开时改变它的任何属性,你可以定义这个方法。这个方法在每次打开对话框时被调用,而onCreateDialog(int) 仅在对话框第一次打开时被调用如果你不定义onPrepareDialog(),那么这个对话框将保持和上次打开时一样。这个方法也被传递以对话框的ID,和在onCreateDialog()中创建的对话框对象。(个人理解是,在本Activity里第一次show某个Dialog,则先调用onCreateDialog,得到返回的Dialog对象并挂靠在Activity,保存Dialog对象的引用,然后才显示Dialog。这样子,下次再show Dialog就不用重新创建Dialog对象,而是重用旧的)

        定义onCreateDialog(int) 和 onPrepareDialog(int, Dialog) 回调函数的最佳方法是使用一个switch 语句来检查传递进来的id 参数。每个case 应该检查一个唯一的对话框ID然后创建和定义相应的对话框。比如,想象一下一个游戏使用两个不同的对话框:一个用来指示这个游戏已经暂停而另一个来指示游戏结束。首先,为每个对话框定义一个常量:

    1. static final int DIALOG_PAUSED_ID = 0
    2. static final int DIALOG_GAMEOVER_ID = 1

    然后,为每一个ID用一个switch case定义这个onCreateDialog(int) 回调函数:

    1. protected Dialog onCreateDialog(int id) { 
    2.     Dialog dialog; 
    3.     switch(id) { 
    4.     case DIALOG_PAUSED_ID: 
    5.         // do the work to define the pause Dialog 
    6.         break
    7.     case DIALOG_GAMEOVER_ID: 
    8.         // do the work to define the game over Dialog 
    9.         break
    10.     default
    11.         dialog = null
    12.     } 
    13.     return dialog; 

    当是时候显示其中之一的对话框时,使用对话框ID调用showDialog(int):

    1. showDialog(DIALOG_PAUSED_ID); 
     

    消除对话框Dismissing a Dialog

        当你准备关闭对话框时,你可以通过对这个对话框调用dismiss()来消除它。如果需要,你还可以从这个Activity中调用dismissDialog(int id) 方法,这实际上将为你对这个对话框调用dismiss() 方法。

        如果你想使用onCreateDialog(int id) 方法来管理你对话框的状态(就如同在前面的章节讨论的那样),然后每次你的对话框消除的时候,这个对话框对象的状态将由该Activity保留。如果你决定不再需要这个对象或者清除该状态是重要的,那么你应该调用removeDialog(int id)。这将删除任何内部对象引用而且如果这个对话框正在显示,它将被消除。

     

    使用消除侦听器Using dismiss listeners

        如果你希望你的应用程序在一个对话框消亡的时候执行一些流程,那么你应该附着一个on-dismiss侦听器到对话框上。

    1. @Override 
    2. protected void onPrepareDialog(int id, Dialog dialog) { 
    3.     switch(id){ 
    4.     case PROGRESS_DIALOG: 
    5.         dialog.setOnDismissListener(new DialogInterface.OnDismissListener()
    6.             @Override 
    7.             public void onDismiss(DialogInterface dialog) { 
    8.                 Toast.makeText(getApplicationContext(), 
    9.                         "dismiss listener!"
    10.                         Toast.LENGTH_SHORT) 
    11.                 .show(); 
    12.             } 
    13.         }); 
    14.     } 

        然而, 请注意对话框也可以被“取消”。这是一个表明对话框被用户显示取消的特殊情况。这将在用户按“返回”按钮时发生,或者这个对话框显示的调用cancel() (也许通过对话框上的一个“取消”按钮)。当一个对话框被取消时,这个OnDismissListener 依然会被通知到,但是如果你希望在对话框被显示取消时被通知到(而不是通常的消除方式),那么你应该通过setOnCancelListener()注册一个DialogInterface.OnCancelListener 

        目前个人学习发现,一般情况下,调用dialog.cancel()就会触发onCancelLister。而点击AlertDialog的NegativeButton (Cancel/No)是不会触发的。对于setOnCancelListener()要注意的是,这里有两个setOnCancelListener(),但返回值不同:

    1. //AlertDialog.Builder调用的 
    2. public AlertDialog.Builder setOnCancelListener (DialogInterface.OnCancelListener onCancelListener) 
    3.  
    4. //Dialog调用的 
    5. public void setOnCancelListener (DialogInterface.OnCancelListener listener) 
     

    警告对话框AlertDialog的使用

        为了创建一个警告对话框,使用AlertDialog.Builder 子类。通过AlertDialog.Builder(Context)获取一个构造器然后使用这个类的公共方法来定义警告对话框的所有属性。当得到构造器后,通过create().方法来获取警告对话框对象。有时我是不调用create()的,而是在设置好了后直接调用show()显示AlertDialog。

    Dialog_button Dialog_button Dialog_button

    增加按钮Adding buttons

        这就是我一开始很想知道的究竟如何添加Yes/No,Ok/Cancel这样的按钮。原来是通过setPositiveButton(...)响应Yes/Ok的点击,setNeutralButton(...)响应中立行为的点击,setNegativeButton(...)响应No/Cancel的点击。注意,只能各自设置一个按钮来响应点击事件。

    1. AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    2. builder.setMessage("Are you sure you want to exit?"
    3.        .setCancelable(false
    4.        .setPositiveButton("Yes"new DialogInterface.OnClickListener() { 
    5.            public void onClick(DialogInterface dialog, int id) { 
    6.                 MyActivity.this.finish(); 
    7.            } 
    8.        }) 
    9.        .setNegativeButton("No"new DialogInterface.OnClickListener() { 
    10.            public void onClick(DialogInterface dialog, int id) { 
    11.                 dialog.cancel(); 
    12.            } 
    13.        }); 
    14. AlertDialog alert = builder.create(); 

        首先,为这个对话框添加一个消息setMessage(CharSequence)。然后,开始函数链并设置该对话框为不能取消not cancelable (因此用户不能使用返回按钮关闭这个对话框)。对每个按钮,使用任一set...Button() 方法,比如setPositiveButton(),该方法接受按钮名称以及一个定义用户选中按钮后所采取动作的DialogInterface.OnClickListener

    增加一个列表Adding a list
    1. final CharSequence[] items = {"Red""Green""Blue"}; 
    2.   
    3. AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    4. builder.setTitle("Pick a color"); 
    5. builder.setItems(items, new DialogInterface.OnClickListener() { 
    6.     public void onClick(DialogInterface dialog, int item) { 
    7.         Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show(); 
    8.     } 
    9. }); 
    10. AlertDialog alert = builder.create(); 

        首先,用setTitle(CharSequence)方法给对话框添加一个标题。然后,添加用setItems()添加一个可选项列表,该列表接受一组显示的items和一个DialogInterface.OnClickListener 来定义用户选中按钮后所采取动作。

    增加复选框和单选按钮

        要在对话框里创建一个多选项列表(checkboxes)或者单选项(radio buttons),可分别调用setMultiChoiceItems() 和setSingleChoiceItems() 方法。如果你在onCreateDialog()回调函数中创建这些可选列表,Android会帮你管理列表状态。只要这个活动是激活的,对话框会记住之前选中的items,但如果用户退出这个活动,用户选择将丢失。

        注意: 为了在用户离开或暂停这个活动的时候能够保存选择,你必须通过活动生命期Activity Lifecycle来恰当的保存和恢复设置。为了永久保存选项,即使活动进程被完全终止,你需要使用数据存储Data Storage技术。

    1. final CharSequence[] items = {"Red""Green""Blue"}; 
    2.   
    3. AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    4. builder.setTitle("Pick a color"); 
    5. builder.setSingleChoiceItems(items, -1new DialogInterface.OnClickListener() { 
    6.     public void onClick(DialogInterface dialog, int item) { 
    7.         Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show(); 
    8.     } 
    9. }); 
    10. AlertDialog alert = builder.create(); 

        setSingleChoiceItems() 的第二个参数是一个checkedItem整型数值,指示了基于0的缺省选择项的位置。“-1”代表不会有默认选择项。

     

    进度对话框Progress Dialog的使用

        ProgressDialogAlertDialog类的一个扩展,可以为一个未定义进度的任务显示一个旋转轮形状的进度动画,或者为一个指定进度的任务显示一个进度条。

        可以简单地通过调用ProgressDialog.show()方法来显示一个进度对话框,而通过onCreateDialog(int)回调管理这个对话框是可选的,如下所示:

    1. ProgressDialog.show(this// context 
    2.     ""// title 
    3.     "Loading. Please wait..."// message 
    4.     true); //进度是否是不确定的,这只和创建进度条有关 


     

    展开全文
  • AlertDialog详解

    2016-05-20 14:42:59
    AlertDialog的构造方法全部是Protected的,所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。 要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法。 使用AlertDialog.Buil

    refer:http://www.2cto.com/kf/201205/131876.html

    简介

    AlertDialog的构造方法全部是Protected的,所以不能直接通过new一个AlertDialog来创建出一个AlertDialog

    要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法。

    使用AlertDialog.Builder创建对话框需要了解以下几个方法:

    setTitle :为对话框设置标题 
    setIcon
    :为对话框设置图标 
    setMessage
    :为对话框设置内容 
    setView
    给对话框设置自定义样式 
    setItems
    :设置对话框要显示的一个list,一般用于显示几个命令时 
    setMultiChoiceItems
    :用来设置对话框显示一系列的复选框 
    setNeutralButton   
    :普通按钮

    setPositiveButton   :给对话框添加"Yes"按钮 
    setNegativeButton
    :对话框添加"No"按钮 

    setCancelable();// 设置取消功能:设置为true表示取消功能可以使用,设置为false表示取消功能不可用(强制做某事
    //设置为true时可以 给对话框添加取消监听器,用户取消对话框时调用此函数
    builder.setOnCancelListener(new OnCancelListener() {
    public void onCancel(DialogInterface dialog) {

    }
    });

    dismiss:关闭对话框(Dialog类中的)
    create
    创建对话框 
    show
    :显示对话框 


    一、简单的AlertDialog

    下面,创建一个简单的ALertDialog并显示它:

    package com.tianjf;  
    import android.app.Activity;  
    import android.app.AlertDialog;  
    import android.app.Dialog;  
    import android.os.Bundle;  
    public class Dialog_AlertDialogDemoActivity extends Activity {  
        /** Called when the activity is first created. */  
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
           super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
            Dialog alertDialog = newAlertDialog.Builder(this).  
                   setTitle("对话框的标题").  
                   setMessage("对话框的内容").  
                   setIcon(R.drawable.ic_launcher).  
                   create();  
            alertDialog.show();  
        }  
    }  
    package com.tianjf;
    import android.app.Activity; 
    import android.app.AlertDialog; 
    import android.app.Dialog; 
    import android.os.Bundle;
    public class Dialog_AlertDialogDemoActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main);
      Dialog alertDialog = new AlertDialog.Builder(this). 
        setTitle("对话框的标题"). 
        setMessage("对话框的内容"). 
        setIcon(R.drawable.ic_launcher). 
        create(); 
      alertDialog.show(); 
    } 

    }运行结果如下:


    二、带按钮的AlertDialog

    上面的例子很简单,下面我们在这个AlertDialog上面加几个Button,实现删除操作的提示对话框

    package com.tianjf;  
    import android.app.Activity;  
    import android.app.AlertDialog;  
    import android.app.Dialog;  
    import android.content.DialogInterface;  
    import android.os.Bundle;  
    public class Dialog_AlertDialogDemoActivity extends Activity {  
        /** Called when the activity is first created. */  
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
           super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
            Dialog alertDialog = newAlertDialog.Builder(this).  
                   setTitle("确定删除?").  
                   setMessage("您确定删除该条信息吗?").  
                   setIcon(R.drawable.ic_launcher).  
                   setPositiveButton("确定",new DialogInterface.OnClickListener() {  
                       @Override  
                       public void onClick(DialogInterface dialog, int which) {  
                           // TODO Auto-generated method stub   
                       }  
                   }).  
                   setNegativeButton("取消",new DialogInterface.OnClickListener() {  
                       @Override  
                       public void onClick(DialogInterface dialog, int which) {  
                           // TODO Auto-generated method stub   
                       }  
                   }).  
                   setNeutralButton("查看详情", new DialogInterface.OnClickListener() {  
                       @Override  
                       public void onClick(DialogInterface dialog, int which) {  
                           // TODO Auto-generated method stub   
                       }  
                   }).  
                   create();  
            alertDialog.show();  
        }  
    }  
    package com.tianjf;
    import android.app.Activity; 
    import android.app.AlertDialog; 
    import android.app.Dialog; 
    import android.content.DialogInterface; 
    import android.os.Bundle;
    public class Dialog_AlertDialogDemoActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main);
      Dialog alertDialog = new AlertDialog.Builder(this). 
        setTitle("确定删除?"). 
        setMessage("您确定删除该条信息吗?"). 
        setIcon(R.drawable.ic_launcher). 
        setPositiveButton("确定", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which){ 
          // TODO Auto-generated method stub 
         } 
        }). 
        setNegativeButton("取消", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which){ 
          // TODO Auto-generated method stub 
         } 
        }). 
        setNeutralButton("查看详情", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which){ 
          // TODO Auto-generated method stub 
         } 
        }). 
        create(); 
      alertDialog.show(); 
    } 

    在这个例子中,我们定义了三个按钮,分别是"Yes"按钮,"No"按钮以及一个普通按钮,每个按钮都有onClick事件,TODO的地方可以放点了按钮之后想要做的一些处理

    看一下运行结果:


    可以看到三个按钮添加到了AlertDialog上,三个没有添加事件处理的按钮,点了只是关闭对话框,没有任何其他操作。

    三、类似ListViewAlertDialog 

    setItems(CharSequence[]items, final OnClickListener listener) 方法来实现类似 ListView AlertDialog

    第一个参数是要显示的数据的数组,第二个参数是点击某个item的触发事件

    package com.tianjf;  
    import android.app.Activity;  
    import android.app.AlertDialog;  
    import android.app.Dialog;  
    import android.content.DialogInterface;  
    import android.os.Bundle;  
    import android.widget.Toast;  
    public class Dialog_AlertDialogDemoActivity extends Activity {  
        /** Called when the activity is first created. */  
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
           super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
            final String[] arrayFruit = newString[] { "苹果","橘子","草莓","香蕉"};  
            Dialog alertDialog = newAlertDialog.Builder(this).  
                   setTitle("你喜欢吃哪种水果?").  
                   setIcon(R.drawable.ic_launcher)  
                   .setItems(arrayFruit, new DialogInterface.OnClickListener() {  
                       @Override  
                       public void onClick(DialogInterface dialog, int which) {  
                           Toast.makeText(Dialog_AlertDialogDemoActivity.this, arrayFruit[which],Toast.LENGTH_SHORT).show();  
                       }  
                   }).  
                   setNegativeButton("取消",new DialogInterface.OnClickListener() {  
                       @Override  
                       public void onClick(DialogInterface dialog, int which) {  
                           // TODO Auto-generated method stub   
                       }  
                   }).  
                   create();  
            alertDialog.show();  
        }  
    }  
    package com.tianjf;
    import android.app.Activity; 
    import android.app.AlertDialog; 
    import android.app.Dialog; 
    import android.content.DialogInterface; 
    import android.os.Bundle; 
    import android.widget.Toast;
    public class Dialog_AlertDialogDemoActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main);
     final String[] arrayFruit = new String[] { "苹果", "橘子","草莓","香蕉"};
      Dialog alertDialog = new AlertDialog.Builder(this). 
        setTitle("你喜欢吃哪种水果?"). 
        setIcon(R.drawable.ic_launcher) 
        .setItems(arrayFruit, new DialogInterface.OnClickListener(){ 
         @Override 
         public void onClick(DialogInterface dialog, int which){ 
         Toast.makeText(Dialog_AlertDialogDemoActivity.this, arrayFruit[which],Toast.LENGTH_SHORT).show(); 
         } 
        }). 
        setNegativeButton("取消", new DialogInterface.OnClickListener() {
         @Override 
         public void onClick(DialogInterface dialog, int which){ 
          // TODO Auto-generated method stub 
         } 
        }). 
        create(); 
      alertDialog.show(); 
    } 
    }

    运行结果如下:


    四、类似RadioButtonAlertDialog 

    setSingleChoiceItems(CharSequence[]items, int checkedItem, final OnClickListener listener) 方法来实现类似 RadioButton AlertDialog

    第一个参数是要显示的数据的数组,第二个参数是初始值(初始被选中的item),第三个参数是点击某个item的触发事件

    在这个例子里面我们设了一个selectedFruitIndex用来记住选中的itemindex

    package com.tianjf;  
    import android.app.Activity;  
    import android.app.AlertDialog;  
    import android.app.Dialog;  
    import android.content.DialogInterface;  
    import android.os.Bundle;  
    import android.widget.Toast;  
    public class Dialog_AlertDialogDemoActivity extends Activity {  
        private int selectedFruitIndex = 0;  
        /** Called when the activity is first created. */  
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
           super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
            final String[] arrayFruit = newString[] { "苹果","橘子","草莓","香蕉"};  
            Dialog alertDialog = newAlertDialog.Builder(this).  
                   setTitle("你喜欢吃哪种水果?").  
                   setIcon(R.drawable.ic_launcher)  
                   .setSingleChoiceItems(arrayFruit, 0, new DialogInterface.OnClickListener(){  
                       @Override  
                       public void onClick(DialogInterface dialog, int which) {  
                           selectedFruitIndex = which;  
                       }  
                   }).  
                   setPositiveButton("确认",new DialogInterface.OnClickListener() {  
                       @Override  
                       public void onClick(DialogInterface dialog, int which) {  
                           Toast.makeText(Dialog_AlertDialogDemoActivity.this,arrayFruit[selectedFruitIndex], Toast.LENGTH_SHORT).show();  
                       }  
                   }).  
                   setNegativeButton("取消",new DialogInterface.OnClickListener() {  
                       @Override  
                       public void onClick(DialogInterface dialog, int which) {  
                           // TODO Auto-generated method stub   
                       }  
                   }).  
                   create();  
            alertDialog.show();  
        }  
    }  
    package com.tianjf;
    import android.app.Activity; 
    import android.app.AlertDialog; 
    import android.app.Dialog; 
    import android.content.DialogInterface; 
    import android.os.Bundle; 
    import android.widget.Toast;
    public class Dialog_AlertDialogDemoActivity extends Activity { 
    private int selectedFruitIndex = 0; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main);
     final String[] arrayFruit = new String[] { "苹果", "橘子","草莓","香蕉"};
      Dialog alertDialog = new AlertDialog.Builder(this). 
        setTitle("你喜欢吃哪种水果?"). 
        setIcon(R.drawable.ic_launcher) 
        .setSingleChoiceItems(arrayFruit, 0, newDialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which){ 
          selectedFruitIndex = which; 
         } 
        }). 
        setPositiveButton("确认", new DialogInterface.OnClickListener() {
         @Override 
         public void onClick(DialogInterface dialog, int which){ 
         Toast.makeText(Dialog_AlertDialogDemoActivity.this,arrayFruit[selectedFruitIndex], Toast.LENGTH_SHORT).show(); 
         } 
        }). 
        setNegativeButton("取消", new DialogInterface.OnClickListener() {
         @Override 
         public void onClick(DialogInterface dialog, int which){ 
          // TODO Auto-generated method stub 
         } 
        }). 
        create(); 
      alertDialog.show(); 
    } 
    }

    运行结果如下:


    五、类似CheckBoxAlertDialog 

    setMultiChoiceItems(CharSequence[]items, boolean[] checkedItems, final OnMultiChoiceClickListener listener) 方法来实现类似 CheckBox AlertDialog 
    第一个参数是要显示的数据的数组,第二个参数是选中状态的数组,第三个参数是点击某个 item 的触发事件

    package com.tianjf;  
    import android.app.Activity;  
    import android.app.AlertDialog;  
    import android.app.Dialog;  
    import android.content.DialogInterface;  
    import android.os.Bundle;  
    import android.widget.Toast;  
    public class Dialog_AlertDialogDemoActivity extends Activity {  
        /** Called when the activity is first created. */  
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
           super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
            final String[] arrayFruit = newString[] { "苹果","橘子","草莓","香蕉"};  
            final boolean[] arrayFruitSelected =new boolean[] {true, true, false, false};  
            Dialog alertDialog = newAlertDialog.Builder(this).  
                   setTitle("你喜欢吃哪种水果?").  
                   setIcon(R.drawable.ic_launcher)  
                   .setMultiChoiceItems(arrayFruit, arrayFruitSelected, newDialogInterface.OnMultiChoiceClickListener() {  
                       @Override  
                       public void onClick(DialogInterface dialog, int which, boolean isChecked){  
                           arrayFruitSelected[which] = isChecked;  
                       }  
                   }).  
                   setPositiveButton("确认",new DialogInterface.OnClickListener() {  
                       @Override  
                       public void onClick(DialogInterface dialog, int which) {  
                           StringBuilder stringBuilder = new StringBuilder();  
                           for (int i = 0; i < arrayFruitSelected.length; i++) {  
                               if (arrayFruitSelected[i] == true)  
                               {  
                                   stringBuilder.append(arrayFruit[i] + "、");  
                               }  
                           }  
                           Toast.makeText(Dialog_AlertDialogDemoActivity.this, stringBuilder.toString(),Toast.LENGTH_SHORT).show();  
                       }  
                   }).  
                   setNegativeButton("取消",new DialogInterface.OnClickListener() {  
                       @Override  
                       public void onClick(DialogInterface dialog, int which) {  
                           // TODO Auto-generated method stub   
                       }  
                   }).  
                   create();  
            alertDialog.show();  
        }  
    }  
    package com.tianjf;
    import android.app.Activity; 
    import android.app.AlertDialog; 
    import android.app.Dialog; 
    import android.content.DialogInterface; 
    import android.os.Bundle; 
    import android.widget.Toast;
    public class Dialog_AlertDialogDemoActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main);
      final String[] arrayFruit = new String[] { "苹果", "橘子", "草莓", "香蕉" }; 
      final boolean[] arrayFruitSelected = new boolean[] {true, true, false,false};
      Dialog alertDialog = new AlertDialog.Builder(this). 
        setTitle("你喜欢吃哪种水果?"). 
        setIcon(R.drawable.ic_launcher) 
        .setMultiChoiceItems(arrayFruit, arrayFruitSelected, newDialogInterface.OnMultiChoiceClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which,boolean isChecked) { 
          arrayFruitSelected[which] = isChecked; 
         } 
        }). 
        setPositiveButton("确认", new DialogInterface.OnClickListener() {
         @Override 
         public void onClick(DialogInterface dialog, int which){ 
          StringBuilder stringBuilder = newStringBuilder(); 
          for (int i = 0; i < arrayFruitSelected.length;i++) { 
           if (arrayFruitSelected[i] == true) 
           { 
            stringBuilder.append(arrayFruit[i] +"、"); 
           } 
          } 
         Toast.makeText(Dialog_AlertDialogDemoActivity.this, stringBuilder.toString(),Toast.LENGTH_SHORT).show(); 
         } 
        }). 
        setNegativeButton("取消", new DialogInterface.OnClickListener() {
         @Override 
         public void onClick(DialogInterface dialog, int which){ 
          // TODO Auto-generated method stub 
         } 
        }). 
        create(); 
      alertDialog.show(); 
    } 

    }运行结果如下:


    六、自定义ViewAlertDialog 

    有时候我们不能满足系统自带的 AlertDialog 风格,就比如说我们要实现一个 Login 画面,有用户名和密码,这时我们就要用到自定义 View AlertDialog

    先创建Login画面的布局文件

     <?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" >  
        <LinearLayout  
           android:layout_width="fill_parent"  
           android:layout_height="wrap_content"  
            android:gravity="center">  
            <TextView  
               android:layout_width="0dip"  
               android:layout_height="wrap_content"  
               android:layout_weight="1"  
                android:text="@string/user"/>  
            <EditText  
               android:layout_width="0dip"  
               android:layout_height="wrap_content"  
               android:layout_weight="1" />  
        </LinearLayout>  
        <LinearLayout  
            android:layout_width="fill_parent"  
           android:layout_height="wrap_content"  
            android:gravity="center">  
            <TextView  
               android:layout_width="0dip"  
               android:layout_height="wrap_content"  
               android:layout_weight="1"  
               android:text="@string/passward" />  
            <EditText  
               android:layout_width="0dip"  
               android:layout_height="wrap_content"  
               android:layout_weight="1" />  
        </LinearLayout>  
    </LinearLayout>  
    <?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" >
        <LinearLayout 
           android:layout_width="fill_parent" 
           android:layout_height="wrap_content" 
            android:gravity="center">
            <TextView 
               android:layout_width="0dip" 
               android:layout_height="wrap_content" 
               android:layout_weight="1" 
               android:text="@string/user" />
            <EditText 
               android:layout_width="0dip" 
               android:layout_height="wrap_content" 
                android:layout_weight="1"/> 
        </LinearLayout>
        <LinearLayout 
           android:layout_width="fill_parent" 
           android:layout_height="wrap_content" 
            android:gravity="center">
            <TextView 
               android:layout_width="0dip" 
               android:layout_height="wrap_content" 
               android:layout_weight="1" 
               android:text="@string/passward" />
            <EditText 
               android:layout_width="0dip" 
               android:layout_height="wrap_content" 
                android:layout_weight="1"/> 
        </LinearLayout>
    </LinearLayout> 

    然后在Activity里面把Login画面的布局文件添加到AlertDialog

    package com.tianjf;  
    import android.app.Activity;  
    import android.app.AlertDialog;  
    import android.app.Dialog;  
    import android.content.DialogInterface;  
    import android.os.Bundle;  
    import android.view.LayoutInflater;  
    import android.view.View;  
    public class Dialog_AlertDialogDemoActivity extends Activity {  
        /** Called when the activity is first created. */  
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
           super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
            // 取得自定义View   
            LayoutInflater layoutInflater =LayoutInflater.from(this);  
            View myLoginView = layoutInflater.inflate(R.layout.login,null);  
            Dialog alertDialog = newAlertDialog.Builder(this).  
                   setTitle("用户登录").  
                   setIcon(R.drawable.ic_launcher).  
                   setView(myLoginView).  
                   setPositiveButton("登录",new DialogInterface.OnClickListener() {  
                       @Override  
                       public void onClick(DialogInterface dialog, int which) {  
                           // TODO Auto-generated method stub   
                       }  
                   }).  
                   setNegativeButton("取消",new DialogInterface.OnClickListener() {  
                       @Override  
                       public void onClick(DialogInterface dialog, int which) {  
                           // TODO Auto-generated method stub   
                       }  
                   }).  
                   create();  
            alertDialog.show();  
        }  
    }  
    package com.tianjf;
    import android.app.Activity; 
    import android.app.AlertDialog; 
    import android.app.Dialog; 
    import android.content.DialogInterface; 
    import android.os.Bundle; 
    import android.view.LayoutInflater; 
    import android.view.View;
    public class Dialog_AlertDialogDemoActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main);
      // 取得自定义View 
      LayoutInflater layoutInflater = LayoutInflater.from(this); 
      View myLoginView = layoutInflater.inflate(R.layout.login, null); 
      Dialog alertDialog = new AlertDialog.Builder(this). 
        setTitle("用户登录"). 
        setIcon(R.drawable.ic_launcher). 
        setView(myLoginView). 
        setPositiveButton("登录", new DialogInterface.OnClickListener() {
         @Override 
         public void onClick(DialogInterface dialog, int which){ 
          // TODO Auto-generated method stub 
         } 
        }). 
        setNegativeButton("取消", new DialogInterface.OnClickListener() {
         @Override 
         public void onClick(DialogInterface dialog, int which){ 
          // TODO Auto-generated method stub 
         } 
        }). 
        create(); 
      alertDialog.show(); 
    } 

    }运行结果如下:

     

     

    展开全文
  • AlertDialog自定义

    2014-02-21 14:41:30
    AlertDialog的构造方法全部是Protected的,所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。 要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法。 使用AlertDialog.Builder创建...

    AlertDialog的构造方法全部是Protected的,所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。

    要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法。

    使用AlertDialog.Builder创建对话框需要了解以下几个方法:

    setTitle :为对话框设置标题
    setIcon :为对话框设置图标
    setMessage:为对话框设置内容
    setView : 给对话框设置自定义样式
    setItems :设置对话框要显示的一个list,一般用于显示几个命令时
    setMultiChoiceItems :用来设置对话框显示一系列的复选框
    setNeutralButton    :普通按钮

    setPositiveButton   :给对话框添加"Yes"按钮
    setNegativeButton :对话框添加"No"按钮
    create : 创建对话框
    show :显示对话框
    一、简单的AlertDialog

    下面,创建一个简单的ALertDialog并显示它:


    [java]  package com.tianjf; 
     
    import android.app.Activity; 
    import android.app.AlertDialog; 
    import android.app.Dialog; 
    import android.os.Bundle; 
     
    public class Dialog_AlertDialogDemoActivity extends Activity { 
        /** Called when the activity is first created. */ 
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.main); 
     
            Dialog alertDialog = new AlertDialog.Builder(this). 
                    setTitle("对话框的标题"). 
                    setMessage("对话框的内容"). 
                    setIcon(R.drawable.ic_launcher). 
                    create(); 
            alertDialog.show(); 
        } 

    package com.tianjf;

    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.Dialog;
    import android.os.Bundle;

    public class Dialog_AlertDialogDemoActivity extends Activity {
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      Dialog alertDialog = new AlertDialog.Builder(this).
        setTitle("对话框的标题").
        setMessage("对话框的内容").
        setIcon(R.drawable.ic_launcher).
        create();
      alertDialog.show();
     }
    }运行结果如下:

     \

     


    二、带按钮的AlertDialog

    上面的例子很简单,下面我们在这个AlertDialog上面加几个Button,实现删除操作的提示对话框


    [java] package com.tianjf; 
     
    import android.app.Activity; 
    import android.app.AlertDialog; 
    import android.app.Dialog; 
    import android.content.DialogInterface; 
    import android.os.Bundle; 
     
    public class Dialog_AlertDialogDemoActivity extends Activity { 
        /** Called when the activity is first created. */ 
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.main); 
     
            Dialog alertDialog = new AlertDialog.Builder(this). 
                    setTitle("确定删除?"). 
                    setMessage("您确定删除该条信息吗?"). 
                    setIcon(R.drawable.ic_launcher). 
                    setPositiveButton("确定", new DialogInterface.OnClickListener() { 
                         
                        @Override 
                        public void onClick(DialogInterface dialog, int which) { 
                            // TODO Auto-generated method stub  
                        } 
                    }). 
                    setNegativeButton("取消", new DialogInterface.OnClickListener() { 
                         
                        @Override 
                        public void onClick(DialogInterface dialog, int which) { 
                            // TODO Auto-generated method stub  
                        } 
                    }). 
                    setNeutralButton("查看详情", new DialogInterface.OnClickListener() { 
                         
                        @Override 
                        public void onClick(DialogInterface dialog, int which) { 
                            // TODO Auto-generated method stub  
                        } 
                    }). 
                    create(); 
            alertDialog.show(); 
        } 

    package com.tianjf;

    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.Dialog;
    import android.content.DialogInterface;
    import android.os.Bundle;

    public class Dialog_AlertDialogDemoActivity extends Activity {
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      Dialog alertDialog = new AlertDialog.Builder(this).
        setTitle("确定删除?").
        setMessage("您确定删除该条信息吗?").
        setIcon(R.drawable.ic_launcher).
        setPositiveButton("确定", new DialogInterface.OnClickListener() {
         
         @Override
         public void onClick(DialogInterface dialog, int which) {
          // TODO Auto-generated method stub
         }
        }).
        setNegativeButton("取消", new DialogInterface.OnClickListener() {
         
         @Override
         public void onClick(DialogInterface dialog, int which) {
          // TODO Auto-generated method stub
         }
        }).
        setNeutralButton("查看详情", new DialogInterface.OnClickListener() {
         
         @Override
         public void onClick(DialogInterface dialog, int which) {
          // TODO Auto-generated method stub
         }
        }).
        create();
      alertDialog.show();
     }
    }在这个例子中,我们定义了三个按钮,分别是"Yes"按钮,"No"按钮以及一个普通按钮,每个按钮都有onClick事件,TODO的地方可以放点了按钮之后想要做的一些处理

    看一下运行结果:

     \


    可以看到三个按钮添加到了AlertDialog上,三个没有添加事件处理的按钮,点了只是关闭对话框,没有任何其他操作。

     

     

     

    三、类似ListView的AlertDialog
    用setItems(CharSequence[] items, final OnClickListener listener)方法来实现类似ListView的AlertDialog

    第一个参数是要显示的数据的数组,第二个参数是点击某个item的触发事件


    [java] package com.tianjf; 
     
    import android.app.Activity; 
    import android.app.AlertDialog; 
    import android.app.Dialog; 
    import android.content.DialogInterface; 
    import android.os.Bundle; 
    import android.widget.Toast; 
     
    public class Dialog_AlertDialogDemoActivity extends Activity { 
        /** Called when the activity is first created. */ 
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.main); 
     
            final String[] arrayFruit = new String[] { "苹果", "橘子", "草莓", "香蕉" }; 
     
            Dialog alertDialog = new AlertDialog.Builder(this). 
                    setTitle("你喜欢吃哪种水果?"). 
                    setIcon(R.drawable.ic_launcher) 
                    .setItems(arrayFruit, new DialogInterface.OnClickListener() { 
      
                        @Override 
                        public void onClick(DialogInterface dialog, int which) { 
                            Toast.makeText(Dialog_AlertDialogDemoActivity.this, arrayFruit[which], Toast.LENGTH_SHORT).show(); 
                        } 
                    }). 
                    setNegativeButton("取消", new DialogInterface.OnClickListener() { 
     
                        @Override 
                        public void onClick(DialogInterface dialog, int which) { 
                            // TODO Auto-generated method stub  
                        } 
                    }). 
                    create(); 
            alertDialog.show(); 
        } 

    package com.tianjf;

    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.Dialog;
    import android.content.DialogInterface;
    import android.os.Bundle;
    import android.widget.Toast;

    public class Dialog_AlertDialogDemoActivity extends Activity {
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      final String[] arrayFruit = new String[] { "苹果", "橘子", "草莓", "香蕉" };

      Dialog alertDialog = new AlertDialog.Builder(this).
        setTitle("你喜欢吃哪种水果?").
        setIcon(R.drawable.ic_launcher)
        .setItems(arrayFruit, new DialogInterface.OnClickListener() {
     
         @Override
         public void onClick(DialogInterface dialog, int which) {
          Toast.makeText(Dialog_AlertDialogDemoActivity.this, arrayFruit[which], Toast.LENGTH_SHORT).show();
         }
        }).
        setNegativeButton("取消", new DialogInterface.OnClickListener() {

         @Override
         public void onClick(DialogInterface dialog, int which) {
          // TODO Auto-generated method stub
         }
        }).
        create();
      alertDialog.show();
     }
    }运行结果如下:

     \

     

     

     

    四、类似RadioButton的AlertDialog
    用setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener)方法来实现类似RadioButton的AlertDialog

    第一个参数是要显示的数据的数组,第二个参数是初始值(初始被选中的item),第三个参数是点击某个item的触发事件

    在这个例子里面我们设了一个selectedFruitIndex用来记住选中的item的index


    [java] package com.tianjf; 
     
    import android.app.Activity; 
    import android.app.AlertDialog; 
    import android.app.Dialog; 
    import android.content.DialogInterface; 
    import android.os.Bundle; 
    import android.widget.Toast; 
     
    public class Dialog_AlertDialogDemoActivity extends Activity { 
         
        private int selectedFruitIndex = 0; 
         
        /** Called when the activity is first created. */ 
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.main); 
     
            final String[] arrayFruit = new String[] { "苹果", "橘子", "草莓", "香蕉" }; 
     
            Dialog alertDialog = new AlertDialog.Builder(this). 
                    setTitle("你喜欢吃哪种水果?"). 
                    setIcon(R.drawable.ic_launcher) 
                    .setSingleChoiceItems(arrayFruit, 0, new DialogInterface.OnClickListener() { 
      
                        @Override 
                        public void onClick(DialogInterface dialog, int which) { 
                            selectedFruitIndex = which; 
                        } 
                    }). 
                    setPositiveButton("确认", new DialogInterface.OnClickListener() { 
     
                        @Override 
                        public void onClick(DialogInterface dialog, int which) { 
                            Toast.makeText(Dialog_AlertDialogDemoActivity.this, arrayFruit[selectedFruitIndex], Toast.LENGTH_SHORT).show(); 
                        } 
                    }). 
                    setNegativeButton("取消", new DialogInterface.OnClickListener() { 
     
                        @Override 
                        public void onClick(DialogInterface dialog, int which) { 
                            // TODO Auto-generated method stub  
                        } 
                    }). 
                    create(); 
            alertDialog.show(); 
        } 

    package com.tianjf;

    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.Dialog;
    import android.content.DialogInterface;
    import android.os.Bundle;
    import android.widget.Toast;

    public class Dialog_AlertDialogDemoActivity extends Activity {
     
     private int selectedFruitIndex = 0;
     
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      final String[] arrayFruit = new String[] { "苹果", "橘子", "草莓", "香蕉" };

      Dialog alertDialog = new AlertDialog.Builder(this).
        setTitle("你喜欢吃哪种水果?").
        setIcon(R.drawable.ic_launcher)
        .setSingleChoiceItems(arrayFruit, 0, new DialogInterface.OnClickListener() {
     
         @Override
         public void onClick(DialogInterface dialog, int which) {
          selectedFruitIndex = which;
         }
        }).
        setPositiveButton("确认", new DialogInterface.OnClickListener() {

         @Override
         public void onClick(DialogInterface dialog, int which) {
          Toast.makeText(Dialog_AlertDialogDemoActivity.this, arrayFruit[selectedFruitIndex], Toast.LENGTH_SHORT).show();
         }
        }).
        setNegativeButton("取消", new DialogInterface.OnClickListener() {

         @Override
         public void onClick(DialogInterface dialog, int which) {
          // TODO Auto-generated method stub
         }
        }).
        create();
      alertDialog.show();
     }
    }

    运行结果如下:

     \

     


    五、类似CheckBox的AlertDialog
    用setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems, final OnMultiChoiceClickListener listener)方法来实现类似CheckBox的AlertDialog
    第一个参数是要显示的数据的数组,第二个参数是选中状态的数组,第三个参数是点击某个item的触发事件


    [java] package com.tianjf; 
     
    import android.app.Activity; 
    import android.app.AlertDialog; 
    import android.app.Dialog; 
    import android.content.DialogInterface; 
    import android.os.Bundle; 
    import android.widget.Toast; 
     
    public class Dialog_AlertDialogDemoActivity extends Activity { 
        /** Called when the activity is first created. */ 
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.main); 
     
            final String[] arrayFruit = new String[] { "苹果", "橘子", "草莓", "香蕉" }; 
            final boolean[] arrayFruitSelected = new boolean[] {true, true, false, false}; 
     
            Dialog alertDialog = new AlertDialog.Builder(this). 
                    setTitle("你喜欢吃哪种水果?"). 
                    setIcon(R.drawable.ic_launcher) 
                    .setMultiChoiceItems(arrayFruit, arrayFruitSelected, new DialogInterface.OnMultiChoiceClickListener() { 
                         
                        @Override 
                        public void onClick(DialogInterface dialog, int which, boolean isChecked) { 
                            arrayFruitSelected[which] = isChecked; 
                        } 
                    }). 
                    setPositiveButton("确认", new DialogInterface.OnClickListener() { 
     
                        @Override 
                        public void onClick(DialogInterface dialog, int which) { 
                            StringBuilder stringBuilder = new StringBuilder(); 
                            for (int i = 0; i < arrayFruitSelected.length; i++) { 
                                if (arrayFruitSelected[i] == true) 
                                { 
                                    stringBuilder.append(arrayFruit[i] + "、"); 
                                } 
                            } 
                            Toast.makeText(Dialog_AlertDialogDemoActivity.this, stringBuilder.toString(), Toast.LENGTH_SHORT).show(); 
                        } 
                    }). 
                    setNegativeButton("取消", new DialogInterface.OnClickListener() { 
     
                        @Override 
                        public void onClick(DialogInterface dialog, int which) { 
                            // TODO Auto-generated method stub  
                        } 
                    }). 
                    create(); 
            alertDialog.show(); 
        } 

    package com.tianjf;

    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.Dialog;
    import android.content.DialogInterface;
    import android.os.Bundle;
    import android.widget.Toast;

    public class Dialog_AlertDialogDemoActivity extends Activity {
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      final String[] arrayFruit = new String[] { "苹果", "橘子", "草莓", "香蕉" };
      final boolean[] arrayFruitSelected = new boolean[] {true, true, false, false};

      Dialog alertDialog = new AlertDialog.Builder(this).
        setTitle("你喜欢吃哪种水果?").
        setIcon(R.drawable.ic_launcher)
        .setMultiChoiceItems(arrayFruit, arrayFruitSelected, new DialogInterface.OnMultiChoiceClickListener() {
         
         @Override
         public void onClick(DialogInterface dialog, int which, boolean isChecked) {
          arrayFruitSelected[which] = isChecked;
         }
        }).
        setPositiveButton("确认", new DialogInterface.OnClickListener() {

         @Override
         public void onClick(DialogInterface dialog, int which) {
          StringBuilder stringBuilder = new StringBuilder();
          for (int i = 0; i < arrayFruitSelected.length; i++) {
           if (arrayFruitSelected[i] == true)
           {
            stringBuilder.append(arrayFruit[i] + "、");
           }
          }
          Toast.makeText(Dialog_AlertDialogDemoActivity.this, stringBuilder.toString(), Toast.LENGTH_SHORT).show();
         }
        }).
        setNegativeButton("取消", new DialogInterface.OnClickListener() {

         @Override
         public void onClick(DialogInterface dialog, int which) {
          // TODO Auto-generated method stub
         }
        }).
        create();
      alertDialog.show();
     }

    (特别重要!)
    }运行结果如下:

     \

     

     

    六、自定义View的AlertDialog
    有时候我们不能满足系统自带的AlertDialog风格,就比如说我们要实现一个Login画面,有用户名和密码,这时我们就要用到自定义View的AlertDialog

    先创建Login画面的布局文件

    [html] <?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" > 
     
        <LinearLayout 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content" 
            android:gravity="center" > 
     
            <TextView 
                android:layout_width="0dip" 
                android:layout_height="wrap_content" 
                android:layout_weight="1" 
                android:text="@string/user" /> 
     
            <EditText 
                android:layout_width="0dip" 
                android:layout_height="wrap_content" 
                android:layout_weight="1" /> 
        </LinearLayout> 
     
        <LinearLayout 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content" 
            android:gravity="center" > 
     
            <TextView 
                android:layout_width="0dip" 
                android:layout_height="wrap_content" 
                android:layout_weight="1" 
                android:text="@string/passward" /> 
     
            <EditText 
                android:layout_width="0dip" 
                android:layout_height="wrap_content" 
                android:layout_weight="1" /> 
        </LinearLayout> 
     
    </LinearLayout> 
    <?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" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center" >

            <TextView
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/user" />

            <EditText
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center" >

            <TextView
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/passward" />

            <EditText
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1" />
        </LinearLayout>

    </LinearLayout>
    然后在Activity里面把Login画面的布局文件添加到AlertDialog上

    [java] package com.tianjf; 
     
    import android.app.Activity; 
    import android.app.AlertDialog; 
    import android.app.Dialog; 
    import android.content.DialogInterface; 
    import android.os.Bundle; 
    import android.view.LayoutInflater; 
    import android.view.View; 
     
    public class Dialog_AlertDialogDemoActivity extends Activity { 
        /** Called when the activity is first created. */ 
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.main); 
     
            // 取得自定义View  
            LayoutInflater layoutInflater = LayoutInflater.from(this); 
            View myLoginView = layoutInflater.inflate(R.layout.login, null); 
             
            Dialog alertDialog = new AlertDialog.Builder(this). 
                    setTitle("用户登录"). 
                    setIcon(R.drawable.ic_launcher). 
                    setView(myLoginView). 
                    setPositiveButton("登录", new DialogInterface.OnClickListener() { 
     
                        @Override 
                        public void onClick(DialogInterface dialog, int which) { 
                            // TODO Auto-generated method stub  
                        } 
                    }). 
                    setNegativeButton("取消", new DialogInterface.OnClickListener() { 
     
                        @Override 
                        public void onClick(DialogInterface dialog, int which) { 
                            // TODO Auto-generated method stub  
                        } 
                    }). 
                    create(); 
            alertDialog.show(); 
        } 

    package com.tianjf;

    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.Dialog;
    import android.content.DialogInterface;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;

    public class Dialog_AlertDialogDemoActivity extends Activity {
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      // 取得自定义View
      LayoutInflater layoutInflater = LayoutInflater.from(this);
      View myLoginView = layoutInflater.inflate(R.layout.login, null);
      
      Dialog alertDialog = new AlertDialog.Builder(this).
        setTitle("用户登录").
        setIcon(R.drawable.ic_launcher).
        setView(myLoginView).
        setPositiveButton("登录", new DialogInterface.OnClickListener() {

         @Override
         public void onClick(DialogInterface dialog, int which) {
          // TODO Auto-generated method stub
         }
        }).
        setNegativeButton("取消", new DialogInterface.OnClickListener() {

         @Override
         public void onClick(DialogInterface dialog, int which) {
          // TODO Auto-generated method stub
         }
        }).
        create();
      alertDialog.show();
     }
    }运行结果如下:

      \




    展开全文
  • 对话框AlertDialog

    2019-05-19 20:22:13
    final AlertDialog alertDialog = new AlertDialog.Builder(AlertMainActivity.this).create(); 二、第二步,设置对话框的相关属性 alertDialog.setIcon(R.drawable.ic_launcher);//设置图标 ...

    一、第一步,调用Builder方法创建一个对话框(要调用create方法创建)

    final AlertDialog alertDialog = new AlertDialog.Builder(AlertMainActivity.this).create();
    

    二、第二步,设置对话框的相关属性

    	alertDialog.setIcon(R.drawable.ic_launcher);//设置图标
    	alertDialog.setTitle("退出");//设置标题
    	alertDialog.setMessage("是否要退出?");//设置提示信息
    alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定",
    					new OnClickListener() {//设置按钮
    @Override
    		public void onClick(DialogInterface arg0, int arg1) {
    			alertDialog.dismiss();
    			//Activity退出之前要消除dialog,否则会报错
    			AlertMainActivity.this.finish();
    		}
    	});
    

    三、第三步,调用show方法显示对话框

    	alertDialog.show();
    

                  带列表的对话框
    第一步,定义String数组存放列表的内容

    final String[] s = new String[] { "鲤鱼", "鲫鱼", "草鱼", "鲨鱼", "章鱼","鳄鱼" };
    

    第二步,通过AlertDialog.Builder创建Dialog

    AlertDialog.Builder alertDialog = new AlertDialog.Builder(AlertDialogMainActivity.this);
    

    第三步,设置dialog相关属性

    alertDialog.setIcon(R.drawable.ic_launcher);
    alertDialog.setTitle("请选择一种鱼类");
    

    第四步,通过setItem方法将内容添加到列表项

    alertDialog.setItems(s, new DialogInterface.OnClickListener() {}
    

    第五步,给列表项设置点击事件,在监听事件中

    Toast.makeText(AlertDialogMainActivity.this,"您选择了:" + s[position], Toast.LENGTH_SHORT).show();
    

    第六步,将dialog显示出来

    alertDialog.create().show();
    

                  带单选按钮的列表对话框
    第一步,定义String数组存放数据内容

    final String[] s1 = new String[] { "篮球", "足球", "排球", "网球" };
    

    第二步,通过AlertDialog.Builder创建Dialog

    AlertDialog.Builder aBuilder = new AlertDialog.Builder( AlertDialogMainActivity.this);
    

    第三步,设置dialog相关属性

    aBuilder.setTitle("请选择一种运动项目");
    aBuilder.setIcon(R.drawable.ic_launcher);
    

    第四步,通过setSingleChoiceItems方法将内容添加到列表项

    aBuilder.setSingleChoiceItems(s1, 0, new DialogInterface.OnClickListener())
    

    第五步,给列表项设置点击事件,在监听事件中

    Toast.makeText(AlertDialogMainActivity.this,"您选择了:" + s1[position],Toast.LENGTH_SHORT).show();
    

    第六步,添加确定按钮

    aBuilder.setPositiveButton("确定", null);
    

    第七步,显示dialog

    aBuilder.create().show();
    

                  带复选框的对话框
    第一步,定义一个boolean数组和一个String数组,分别用于存放是否选中的状态值和数据

    final boolean state[] = new boolean[] { false, false, false,false, false };
    final String[] s2 = new String[] { "葫芦娃", "黑猫警长", "变形金刚","奥特曼", "小怪兽" };
    

    第二步,通过AlertDialog.Builder创建一个dialog

    AlertDialog.Builder aBuilder2 = new AlertDialog.Builder(AlertDialogMainActivity.this);
    

    第三步,设置dialog相关属性

    aBuilder2.setTitle("请选择");
    aBuilder2.setIcon(R.drawable.ic_launcher);
    

    第四步,setMultiChoiceItems方法将数据和状态值添加到列表项

    aBuilder2.setMultiChoiceItems(s2, state,new OnMultiChoiceClickListener())
    

    第五步,给列表项设置监听事件

    public void onClick(DialogInterface arg0,int position, boolean isChecked)
    

    第六步,在监听事件中将选中的时候状态改变值赋给状态数组

    state[position] = isChecked;
    

    第七步,设置确定按钮获取选中的值

    aBuilder2.setPositiveButton("确定",new android.content.DialogInterface.OnClickListener()()
    

    定义字符串对象并赋初值为空

    String result = "";
    

    遍巡列表项,判断是否选中

    for (int i = 0; i < s2.length; i++)
    //如果选中,将选中的列表项的值逐个赋给字符串对象
    result = result + s2[i] + ",";
    //判断字符串对象的值是否为空
    if (!result.equals(""))
    //如果不为空,通过substring(start,end)方法截取最后的数据,并赋给字符串对象
    result = result.substring(0,result.length() - 1);
    

    第八步,显示dialog

    aBuilder2.create().show();
    

    创建对话框:
    AlertDialog创建对象时要调用create()方法

    AlertDialog builder1 = new  AlertDialog.Builder(
    AlertDialogMainActivity.this).create();
    AlertDialog.Builder创建对象时不用调用create()方法,
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(AlertDialogMainActivity.this);
    

    显示对话框:
    AlertDialog显示对话框时直接调用show()方法

    builder1.show();
    AlertDialog.Builder显示对话框时可以先调用create()方法,再调用show方法;也可以直接调用show()方法
    1.alertDialog.create().show();	
    2.alertDialog. show();
    

    销毁对话框:
    AlertDialog可以调用cancle()方法或dismiss()方法进行销毁

    builder1.dismiss(); 
    builder1.cancle();
    AlertDialog.Builder即没有cancle()方法也没有dismiss()方法
    
    展开全文
  • 使用alertDialog时设置复框时,复框看不见,显示为白色
  • AlertDialog三种对话框的实现

    千次阅读 2015-04-19 17:41:24
    参考:http://blog.csdn.net/woaieillen/article/details/7378324AlertDialog 概述对话框在程序中不是必备的,但是用好对话框能对我们编写的应用增色不少。采用对话框可以大大增加应用的友好性。一般的对话框有种...
  • 目录一:显示基础对话框二:自定义内容对话框:完全自定义对话框 一:显示基础对话框 这是android中自带的基础框架,有提示标题,提示内容,确定和取消按钮 效果图: //获取按钮对象 Button btu_1=findViewById...
  • 如果只需要两个选择(是或否),为AlertDialog添加setPositiveButton()方法和setNegativeButton()方法以及它们的点击事件即可,需要第个选择时可以添加一个setNeutralButton()方法(个按钮的位置请看本文最后的
  • AlertDialog实例

    2014-01-24 10:35:25
    AlertDialog的构造方法全部是Protected的,所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。 要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法。 使用AlertDialog.Builder...
  • Android AlertDialog

    2020-07-15 23:44:52
    Android AlertDialog is used in cases when we require the user to choose an option from the prompt presented on the screen. In this tutorial we will be discussing about creating different Alert Dialog ...
  • android AlertDialog

    2014-04-27 10:48:00
    AlertDialog的构造方法全部是Protected的,所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法。使用AlertDialog.Builder创建对话框...
  • AlertDialog使用

    千次阅读 2016-08-31 00:40:07
    弹框在很多使用都使用到了,比如用户的提示,加载网络信息,弹出对话框,接下来去...android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(this); builder.setIcon
  • android alertdialog

    2012-12-24 16:11:00
    创建对话框 一个对话框一般是一个出现在当前Activity之上的一个小窗口. 处于下面的Activity失去焦点, 对话框接受所有的用户交互.... Android API 支持下列类型的对话框对象: 警告对话框 AlertDialog: 一...
  • AlertDialog的构造方法全部是Protected的,所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。 要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法。 使用AlertDialog.Builder...
  • alertDialog的使用

    2016-08-16 20:05:37
    AlertDialog的构造方法全部是Protected的,所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。 要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法。 使用AlertDialog.Builder...
  • Android AlertDialog大全

    2013-03-20 17:18:27
    1.该效果是当按返回按钮时弹出一个提示,来确保无误操作,采用常见的对话框样式。 ... AlertDialog.Builder builder = new Builder(Main.this);  builder.setMessage("确认退出吗?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,885
精华内容 1,554
关键字:

三选alertdialog