2.2.5 Dialog 对话框类控件的使用

一、ProgressDialog

ProgressDialog代表了进度条对话框,程序只要创建ProgressDialog实例,并将它显示出来就是一个进度条对话框,和它相似的控件有:CharacherPickerDialog、AlertDialog、DatePickerDialog、TimePickerDialog。它的用法有两种:1、直接调用show()方法来显示简单对话框;2、创建ProgressDialog,然后调用方法对对话框里面的进度条进行设置,然后显示出来即可。

常用的方法如下:
  • setProgressStyle:设置进度条风格。
  • setTitlt:设置标题。
  • setMessage:设置提示信息
  • setIcon:设置标题图标
  • setIndeterminate:设置ProgressDialog 的进度条是否不明确;这个属性对于ProgressDailog默认的转轮模式没有实际意义,默认下设置为true,它仅仅对带有ProgressBar的Dialog有作用。修改这个属性为false后可以实时更新进度条的进度。
  • setCancelable:设置ProgressDialog 是否可以按返回键取消。
  • CancelListner:当前Dialog强制取消之后将会被执行,通常用来清理未完成的任务。
  • setButton:设置ProgressDialog 的一个Button(需要监听Button事件);
  • show:显示ProgressDialog。
  • cancel:删除progressdialog。
  • dismiss:删除progressdialog作用和cancel相同。
  • setProgress(intCounter):更新进度条,当然一般都需要Handler的结合来更新进度条。

接下来通过一个例子看一下效果:

  • Activity界面中代码MainActivity .java
public class MainActivity extends Activity{
    final static int MAX_PROGRESS = 100;
    // 该程序模拟填充长度为100的数组
    private int[] data = new int[50];
    // 记录进度对话框的完成百分比
    int progressStatus = 0;
    int hasData = 0;
    ProgressDialog pd1,pd2;
    // 定义一个负责更新的进度的Handler
    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg){
            // 表明消息是由该程序发送的
            if (msg.what == 0x123){
                pd2.setProgress(progressStatus);
            }
        }
    };
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    public void showSpinner(View source){
        // 调用静态方法显示环形进度条
        ProgressDialog.show(this, "任务执行中"
                , "任务执行中,请等待", false, true); // ①
    }
    public void showIndeterminate(View source){
        pd1 = new ProgressDialog(MainActivity.this);
        // 设置对话框的标题
        pd1.setTitle("任务正在执行中");
        // 设置对话框显示的内容
        pd1.setMessage("任务正在执行中,敬请等待...");
        // 设置对话框能用“取消”按钮关闭
        pd1.setCancelable(true);
        // 设置对话框的进度条风格
        pd1.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        // 设置对话框的进度条是否显示进度
        pd1.setIndeterminate(true);
        pd1.show(); // ②
    }
    public void showProgress(View source){
        // 将进度条的完成进度重设为0
        progressStatus = 0;
        // 重新开始填充数组
        hasData = 0;
        pd2 = new ProgressDialog(MainActivity.this);
        pd2.setMax(MAX_PROGRESS);
        // 设置对话框的标题
        pd2.setTitle("任务完成百分比");
        // 设置对话框显示的内容
        pd2.setMessage("耗时任务的完成百分比");
        // 设置对话框不能用“取消”按钮关闭
        pd2.setCancelable(false);
        // 设置对话框的进度条风格
        pd2.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        // 设置对话框的进度条是否显示进度
        pd2.setIndeterminate(false);
        pd2.show(); // ③
        new Thread(){
            public void run(){
                while (progressStatus < MAX_PROGRESS){
                    // 获取耗时操作的完成百分比
                    progressStatus = MAX_PROGRESS
                        * doWork() / data.length;
                    // 发送空消息到Handler
                    handler.sendEmptyMessage(0x123);
                }
                // 如果任务已经完成
                if (progressStatus >= MAX_PROGRESS){
                    // 关闭对话框
                    pd2.dismiss();
                }
            }
        }.start();
    }
    // 模拟一个耗时的操作
    public int doWork(){
        // 为数组元素赋值
        data[hasData++] = (int) (Math.random() * 100);
        try{
            Thread.sleep(100);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        return hasData;
    }
}
  • 相应的布局文件main.xml


    
显示效果:

二、AlertDialog

我们在平时做开发的时候,免不了会用到各种各样的对话框,相信有过其他平台开发经验的朋友都会知道,大部分的平台都只提供了几个最简单的实现,如果我们想实现自己特定需求的对话框,大家可能首先会想到,通过继承等方式,重写我们自己的对话框。当然,这也是不失为一个不错的解决方式,但是一般的情况却是这样,我们重写的对话框,也许只在一个特定的地方会用到,为了这一次的使用,而去创建一个新类,往往有点杀鸡用牛刀的感觉,甚至会对我们的程序增加不必要的复杂性,对于这种情形的对话框有没有更优雅的解决方案呢?

答案是:有!,Android提供了这种问题的解决方案,接下来就给大家介绍几种常用的AlertDialog。

(1)AlertDialog一般的创建步骤:

1、创建AlertDialog.Builder对象;
2、调用AlertDialog.Builder的setTitle()或者setCustomTile()方法设置标题;
3、调用AlertDialog.Builder的setIcon方法设置图标;
4、调用AlertDialog.Builder的相关方法设置内容(相关方法见下);
5、调用AlertDialog.Builder的setPositiveButton、setNegativeButton或者setNeutralButton方法添加多个按钮;
6、调用AlertDialog.Builder的create方法创建AlertDialog对象,再调用AlertDialog对象的show显示出来;

(2)AlertDialog指定内容的方法:

  • setMessage():设置对方内容为简单文本。
  • setItems():设置对话框内容为简单列表项。
  • setSingleChoiceItems():设置对话框内容为单选列表项。
  • setMultiChoiceItems():设置对话框内容为多选列表项。
  • setAdapter():设置对话框内容为自定义列表项。
  • setView():设置对话框内容为自定义View。

(3)下面的例子展示了各种各样的Dialog

  • MainActivity.java
public class MainActivity extends Activity {
    TextView show;
    String[] items = new String[]{
            "大叨安卓", "UI编程",
            "WillFlow",
            "AlertDialog"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        show = (TextView) findViewById(R.id.show);
    }

    public void simple(View source) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this)
                // 设置对话框标题
                .setTitle("简单对话框")
                // 设置图标
                .setIcon(R.drawable.tools)
                .setMessage("对话框的测试内容\n第二行内容测试");
        // 为AlertDialog.Builder添加“确定”按钮
        setPositiveButton(builder);
        // 为AlertDialog.Builder添加“取消”按钮
        setNegativeButton(builder)
                .create()
                .show();
    }

    public void simpleList(View source) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this)
                // 设置对话框标题
                .setTitle("简单列表对话框")
                // 设置图标
                .setIcon(R.drawable.tools)
                // 设置简单的列表项内容
                .setItems(items, new OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        show.setText("你选中了《" + items[which] + "》");
                    }
                });
        // 为AlertDialog.Builder添加“确定”按钮
        setPositiveButton(builder);
        // 为AlertDialog.Builder添加“取消”按钮
        setNegativeButton(builder)
                .create()
                .show();
    }

    public void singleChoice(View source) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this)
                // 设置对话框标题
                .setTitle("单选列表项对话框")
                // 设置图标
                .setIcon(R.drawable.tools)
                // 设置单选列表项,默认选中第二项(索引为1)
                .setSingleChoiceItems(items, 1, new OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        show.setText("你选中了《" + items[which] + "》");
                    }
                });
        // 为AlertDialog.Builder添加“确定”按钮
        setPositiveButton(builder);
        // 为AlertDialog.Builder添加“取消”按钮
        setNegativeButton(builder)
                .create()
                .show();
    }

    public void multiChoice(View source) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this)
                // 设置对话框标题
                .setTitle("多选列表项对话框")
                // 设置图标
                .setIcon(R.drawable.tools)
                // 设置多选列表项,设置勾选第2项、第4项
                .setMultiChoiceItems(items
                        , new boolean[]{false, true, false, true}, null);
        // 为AlertDialog.Builder添加“确定”按钮
        setPositiveButton(builder);
        // 为AlertDialog.Builder添加“取消”按钮
        setNegativeButton(builder)
                .create()
                .show();
    }

    public void customList(View source) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this)
                // 设置对话框标题
                .setTitle("自定义列表项对话框")
                // 设置图标
                .setIcon(R.drawable.tools)
                // 设置自定义列表项
                .setAdapter(new ArrayAdapter(this
                        , R.layout.array_item
                        , items), null);
        // 为AlertDialog.Builder添加“确定”按钮
        setPositiveButton(builder);
        // 为AlertDialog.Builder添加“取消”按钮
        setNegativeButton(builder)
                .create()
                .show();
    }

    public void customView(View source) {
        // 装载app\src\main\res\layout\login.xml界面布局文件
        TableLayout loginForm = (TableLayout) getLayoutInflater()
                .inflate(R.layout.login, null);
        new AlertDialog.Builder(this)
                // 设置对话框的图标
                .setIcon(R.drawable.tools)
                // 设置对话框的标题
                .setTitle("自定义View对话框")
                // 设置对话框显示的View对象
                .setView(loginForm)
                // 为对话框设置一个“确定”按钮
                .setPositiveButton("登录", new OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog,
                                        int which) {
                        // 此处可执行登录处理
                    }
                })
                // 为对话框设置一个“取消”按钮
                .setNegativeButton("取消", new OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog,
                                        int which) {
                        // 取消登录,不做任何事情
                    }
                })
                // 创建并显示对话框
                .create()
                .show();
    }


    private AlertDialog.Builder setPositiveButton(
            AlertDialog.Builder builder) {
        // 调用setPositiveButton方法添加“确定”按钮
        return builder.setPositiveButton("确定", new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                show.setText("单击了【确定】按钮!");
            }
        });
    }

    private AlertDialog.Builder setNegativeButton(
            AlertDialog.Builder builder) {
        // 调用setNegativeButton方法添加“取消”按钮
        return builder.setNegativeButton("取消", new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                show.setText("单击了【取消】按钮!");
            }
        });
    }
}
  • 布局文件main.xml


    
    
    
    
  • 自定义界面布局login.xml



    

        
        
        
    

    

        
        
        
    

    

        
        
        
    

  • 运行效果


感谢优秀的你跋山涉水看到了这里,不如关注下让我们永远在一起!

你可能感兴趣的:(2.2.5 Dialog 对话框类控件的使用)