Android(java)学习笔记197:常见对话框使用AlertDialog.Builder

1.确认取消对话框:

AlertDialog.Builder builder = new Builder(this);
        // 告诉工厂生产什么样的产品
        builder.setTitle("友情提醒");
        builder.setMessage("若练此功,必先自宫,是否继续?");
        builder.setPositiveButton("好的,想好了", new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(MainActivity.this, "啊。。。", 0).show();
                Toast.makeText(MainActivity.this, "及时自宫,也不一定成功", 0).show();
            }
        });
        builder.setNegativeButton("想想再说", new OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(MainActivity.this, "若不自宫,一定不成功", 0).show();
            }
        });
        builder.create().show();

builder.create().show();

这里的只有工厂(AlertDialog.Builder)先创建create()出来AlertDialog然后我们才能show()出来;

这里我们看看create()方法的源码如下:

public AlertDialog create() {
            final AlertDialog dialog = new AlertDialog(P.mContext, mTheme, false);
            P.apply(dialog.mAlert);
            dialog.setCancelable(P.mCancelable);
            if (P.mCancelable) {
                dialog.setCanceledOnTouchOutside(true);
            }
            dialog.setOnCancelListener(P.mOnCancelListener);
            if (P.mOnKeyListener != null) {
                dialog.setOnKeyListener(P.mOnKeyListener);
            }
            return dialog;
        }

返回一个AlertDialog,然后我们再看看show()的源码如下:

public AlertDialog show() {
            AlertDialog dialog = create();
            dialog.show();
            return dialog;
        }

我们发现这里show()中其实也先实现了create(),,所以上面的:

builder.create().show();其实可以改写成:builder.show();

运行的效果如下:

2.单选对话框

// 工厂模式。
        AlertDialog.Builder builder = new Builder(this);
        // 告诉工厂生产什么样的产品
        builder.setTitle("请选择性别:");
        final String[] items = { "男", "女", "未知" };
        builder.setSingleChoiceItems(items, 2, new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();// 关闭对话框
                Toast.makeText(MainActivity.this, "您的性别:" + items[which], 0)
                        .show();
            }
        });
        builder.show();

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

第一个参数是要显示的数据的数组;

第二个参数是初始值(初始被选中的item);

第三个参数是点击某个item的触发事件;

这里OnClickListener里面方法public void onClick(DialogInterface dialog, int which):

第一个参数:用来系统确定对话框(程序中出现多个对话框的时候,系统靠的就是这个参数DialogInterface dialog来确定我们点击的对话框);

第二个参数:用来系统确定我们点击选择的对话框中的子项目;

运行的效果如下:

3. 多选对话框

// 工厂模式。
        AlertDialog.Builder builder = new Builder(this);
        // 告诉工厂生产什么样的产品
        builder.setTitle("请选择您喜欢的水果:");
        final String[] items = { "苹果", "香蕉", "葡萄", "橘子" };
        final boolean[] result = new boolean[] { true, true, false, false };
        builder.setMultiChoiceItems(items, result,
                new OnMultiChoiceClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which,
                            boolean isChecked) {
                        result[which] = isChecked;
                        Toast.makeText(MainActivity.this,
                                items[which] + isChecked, 0).show();
                    }
                });
        builder.setPositiveButton("提交", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                StringBuffer sb = new StringBuffer();
                for (int i = 0; i < result.length; i++) {
                    if (result[i]) {
                        sb.append(items[i] + ",");
                    }
                }
                Toast.makeText(MainActivity.this, "您喜欢:" + sb.toString(), 0)
                        .show();
            }
        });
        builder.show();

public Builder setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems, final OnMultiChoiceClickListener listener)

第一个参数:指定我们要显示的一组下拉多选框的数据集合

第二个参数:代表哪几个选项被选择,如果是null,则表示一个都不选择,如果希望指定哪一个多选选项框被选择,
需要传递一个boolean[]数组进去,其长度要和第一个参数的长度相同,例如 {true, false, false, true};

第三个参数:给每一个多选项绑定一个监听器

这里的监听器OnMultiChoiceClickListener 中的方法: public void onClick(DialogInterface dialog, int which,boolean isChecked) 

第一个参数:用来确定此处工厂模式创建的对话框;

第二个参数:用来确定对话框中我们点击的子项;

第三个参数:用来判别对话框的子项的点击状态(true:表示子项选择;false:表示子项没有被选择)

运行效果:

4.进度对话框

(1)圆形进度条

final ProgressDialog pd = new ProgressDialog(this);
        pd.setTitle("提醒");
        pd.setMessage("正在处理中。。。请稍后");
        pd.show();
        new Thread() {
            public void run() {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                pd.dismiss();
            };
        }.start();

运行效果:

(2)水平进度条

final ProgressDialog pd = new ProgressDialog(this);
        // 设置进度的样式
        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pd.setTitle("提醒");
        pd.setMessage("正在处理中。。。请稍后");
        pd.show();
        new Thread() {
            public void run() {
                pd.setMax(100);
                try {
                    for (int i = 0; i <= 100; i++) {
                        pd.setProgress(i);
                        Thread.sleep(500);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                pd.dismiss();
            };
        }.start();

运行结果:

5.上面代码都是我案例一部分代码,附上的案例程序如下:

(1)activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="click01"
        android:text="确定取消对话框" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="click02"
        android:text="单选对话框" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="click03"
        android:text="多选对话框" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="click04"
        android:text="进度对话框" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="click05"
        android:text="进度对话框" />

</LinearLayout>

布局效果:

(2)接下来就是:MainAcitivity.java:

  1 package com.itheima.dialogset;
  2
  3 import android.app.Activity;
  4 import android.app.AlertDialog;
  5 import android.app.AlertDialog.Builder;
  6 import android.app.ProgressDialog;
  7 import android.content.DialogInterface;
  8 import android.content.DialogInterface.OnClickListener;
  9 import android.content.DialogInterface.OnMultiChoiceClickListener;
 10 import android.os.Bundle;
 11 import android.view.View;
 12 import android.widget.Toast;
 13
 14 public class MainActivity extends Activity {
 15
 16     @Override
 17     protected void onCreate(Bundle savedInstanceState) {
 18         super.onCreate(savedInstanceState);
 19         setContentView(R.layout.activity_main);
 20     }
 21
 22     /**
 23      * 确定取消对话框
 24      *
 25      * @param view
 26      */
 27     public void click01(View view) {
 28         // 工厂模式。
 29         AlertDialog.Builder builder = new Builder(this);
 30         // 告诉工厂生产什么样的产品
 31         builder.setTitle("友情提醒");
 32         builder.setMessage("若练此功,必先自宫,是否继续?");
 33         builder.setPositiveButton("好的,想好了", new OnClickListener() {
 34             @Override
 35             public void onClick(DialogInterface dialog, int which) {
 36                 Toast.makeText(MainActivity.this, "啊。。。", 0).show();
 37                 Toast.makeText(MainActivity.this, "及时自宫,也不一定成功", 0).show();
 38             }
 39         });
 40         builder.setNegativeButton("想想再说", new OnClickListener() {
 41
 42             @Override
 43             public void onClick(DialogInterface dialog, int which) {
 44                 Toast.makeText(MainActivity.this, "若不自宫,一定不成功", 0).show();
 45             }
 46         });
 47         builder.show();
 48     }
 49
 50     /**
 51      * 单选对话框
 52      *
 53      * @param view
 54      */
 55     public void click02(View view) {
 56         // 工厂模式。
 57         AlertDialog.Builder builder = new Builder(this);
 58         // 告诉工厂生产什么样的产品
 59         builder.setTitle("请选择性别:");
 60         final String[] items = { "男", "女", "未知" };
 61         builder.setSingleChoiceItems(items, 2, new OnClickListener() {
 62             @Override
 63             public void onClick(DialogInterface dialog, int which) {
 64                 dialog.dismiss();// 关闭对话框
 65                 Toast.makeText(MainActivity.this, "您的性别:" + items[which], 0)
 66                         .show();
 67             }
 68         });
 69         builder.show();
 70     }
 71
 72     /**
 73      * 多选对话框
 74      *
 75      * @param view
 76      */
 77     public void click03(View view) {
 78         // 工厂模式。
 79         AlertDialog.Builder builder = new Builder(this);
 80         // 告诉工厂生产什么样的产品
 81         builder.setTitle("请选择您喜欢的水果:");
 82         final String[] items = { "苹果", "香蕉", "葡萄", "橘子" };
 83         final boolean[] result = new boolean[] { true, true, false, false };
 84         builder.setMultiChoiceItems(items, result,
 85                 new OnMultiChoiceClickListener() {
 86                     @Override
 87                     public void onClick(DialogInterface dialog, int which,
 88                             boolean isChecked) {
 89                         result[which] = isChecked;
 90                         Toast.makeText(MainActivity.this,
 91                                 items[which] + isChecked, 0).show();
 92                     }
 93                 });
 94         builder.setPositiveButton("提交", new DialogInterface.OnClickListener() {
 95             @Override
 96             public void onClick(DialogInterface dialog, int which) {
 97                 StringBuffer sb = new StringBuffer();
 98                 for (int i = 0; i < result.length; i++) {
 99                     if (result[i]) {
100                         sb.append(items[i] + ",");
101                     }
102                 }
103                 Toast.makeText(MainActivity.this, "您喜欢:" + sb.toString(), 0)
104                         .show();
105             }
106         });
107         builder.show();
108     }
109
110     /**
111      * 进度对话框
112      *
113      * @param view
114      */
115     public void click04(View view) {
116         final ProgressDialog pd = new ProgressDialog(this);
117         pd.setTitle("提醒");
118         pd.setMessage("正在处理中。。。请稍后");
119         pd.show();
120         new Thread() {
121             public void run() {
122                 try {
123                     Thread.sleep(5000);
124                 } catch (InterruptedException e) {
125                     e.printStackTrace();
126                 }
127                 pd.dismiss();
128             };
129         }.start();
130     }
131
132     /**
133      * 进度条对话框
134      *
135      * @param view
136      */
137     public void click05(View view) {
138         final ProgressDialog pd = new ProgressDialog(this);
139         // 设置进度的样式
140         pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
141         pd.setTitle("提醒");
142         pd.setMessage("正在处理中。。。请稍后");
143         pd.show();
144         new Thread() {
145             public void run() {
146                 pd.setMax(100);
147                 try {
148                     for (int i = 0; i <= 100; i++) {
149                         pd.setProgress(i);
150                         Thread.sleep(500);
151                     }
152                 } catch (InterruptedException e) {
153                     e.printStackTrace();
154                 }
155                 pd.dismiss();
156             };
157         }.start();
158     }
159
160 }
时间: 2024-10-13 01:48:29

Android(java)学习笔记197:常见对话框使用AlertDialog.Builder的相关文章

java学习笔记--1_常见输入输出语句熟悉篇章

今天上oj,想来是准备做做算法和数据结构的.看了看以前做的基础题目,想着就先熟悉一下java的语言吧! 以下是今天做的10道题目. 备注:oj有时候对格式要求非常严格,因为不在格式上纠结太久,只要eclipse编译出来正确的结果.我就直接跳过了! 一下是题目及代码: 1001 Hello World! 1 Hello World! 2 3 Time Limit: 200/100 MS (Java/Others) Memory Limit: 32768/5000 K (Java/Others) 4

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过

java/android 设计模式学习笔记(一)---单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使用的时候也会有一些坑. PS:对技术感兴趣的同鞋加群544645972一起交流 设计模式总目录 java/android 设计模式学习笔记目录 特点 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的使用很广泛,比如:线程池(threadpool).缓存(cache).对

java/android 设计模式学习笔记(9)---代理模式

这篇博客我们来介绍一下代理模式(Proxy Pattern),代理模式也成为委托模式,是一个非常重要的设计模式,不少设计模式也都会有代理模式的影子.代理在我们日常生活中也很常见,比如上网时连接的代理服务器地址,更比如我们平时租房子,将找房子的过程代理给中介等等,都是代理模式在日常生活中的使用例子. 代理模式中的代理对象能够连接任何事物:一个网络连接,一个占用很多内存的大对象,一个文件,或者是一些复制起来代价很高甚至根本不可能复制的一些资源.总之,代理是一个由客户端调用去访问幕后真正服务的包装对象

java/android 设计模式学习笔记(2)---观察者模式

这篇来讲一下观察者模式,观察者模式在实际项目中使用的也是非常频繁的,它最常用的地方是GUI系统.订阅--发布系统等.因为这个模式的一个重要作用就是解耦,使得它们之间的依赖性更小,甚至做到毫无依赖.以GUI系统来说,应用的UI具有易变性,尤其是前期随着业务的改变或者产品的需求修改,应用界面也经常性变化,但是业务逻辑基本变化不大,此时,GUI系统需要一套机制来应对这种情况,使得UI层与具体的业务逻辑解耦,观察者模式此时就派上用场了. PS:对技术感兴趣的同鞋加群544645972一起交流. 设计模式

java/android 设计模式学习笔记(5)---对象池模式

这次要介绍一下对象池模式(Object Pool Pattern),这个模式为常见 23 种设计模式之外的设计模式,介绍的初衷主要是在平时的 android 开发中经常会看到,比如 ThreadPool 和 MessagePool 等. 在 java 中,所有对象的内存由虚拟机管理,所以在某些情况下,需要频繁创建一些生命周期很短使用完之后就可以立即销毁,但是数量很大的对象集合,那么此时 GC 的次数必然会增加,这时候为了减小系统 GC 的压力,对象池模式就很适用了.对象池模式也是创建型模式之一,

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl

java/android 设计模式学习笔记(7)---装饰者模式

这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一,但比继承更加灵活.在现实生活中也可以看到很多装饰者模式的例子,或者可以大胆的说装饰者模式无处不在,就拿一件东西来说,可以给它披上无数层不一样的外壳,但是这件东西还是这件东西,外壳不过是用来扩展这个东西的功能而已,这就是装饰者模式,装饰者的这个角色也许各不相同但是被装饰的对

java/android 设计模式学习笔记(13)---享元模式

这篇我们来介绍一下享元模式(Flyweight Pattern),Flyweight 代表轻量级的意思,享元模式是对象池的一种实现.享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,缓存可共享的对象,来达到对象共享和避免创建过多对象的效果,这样一来就可以提升性能,避免内存移除和频繁 GC 等. 享元模式的一个经典使用案例是文本系统中图形显示所用的数据结构,一个文本系统能够显示的字符种类就是那么几十上百个,那么就定义这么些基础字符对象,存储每个字符的显示外形和其他的格式化数据