4.7 对话框(Dialog)

对话框是人机交互过程中十分常见的组件,一般用于在特定条件下对用户显示一些信息,可以增强应用的友好性。

Dialog类是对话框的基类。对话框虽然可以在界面上显示,但是Dialog不是View类的子类,而是直接继承自java.lang.Object类。Dialog对象也有自己的生命周期,其生命周期由创建它的Activity进行管理。Activity可以调用showDialog(int id)将不同id的对话框显示出来,也可以调用dismissDialog(int id)方法将id标识的对话框从用户界面中关闭掉。当Activity调用了showDialog(id)方法,对应id的对话框没有被创建,Android系统会回调OnCreateDialog(id)方法来创建具有该id的对话框。在Activity中创建的对话框都会被Activity保存,下次showDialog(id)方法被调用时,若该id对话框已经不再创建,则系统不会再次调用OnCreateDialog(id)方法创建该对话框,而是会回调onPrepareDialog(int id, Dialog dialog)方法,该方法允许对话框在被显示之前做一些修改。

常用的对话框有AlertDialog和ProgressDialog,本节将通过实例讲解这两种对话框的使用方法。

4.7.1 AlertDialog

AlertDialog对话框是十分常用的用于显示信息的方式,最多可提供三个按钮。AlertDialog不能直接通过构造方法构建,而要由AlertDialog.Builder类来创建。AlertDialog对话框的标题、按钮以及按钮要响应的事件也由AlertDialog.Builder设置。

在使用AlertDialog. Builder创建对话框时常用的几个方法如下:


●setTitle():设置对话框设置标题。

●setIcon():设置对话框设置图标。

●setMessage():设置对话框的提示信息。

●setPositiveButton():对话框添加yes按钮。

●setNegativeButton():对话框添加no按钮。

●setNeutralButton():为对话框添加第三个按钮。


下面通过实例来学习创建AlertDialog的方法。

创建Eclipse Android工程DialogDemo,并在main.xml中添加两个按钮,分别为AlertDialog和ProcessDialog。

其main.xml代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical">



       <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Dialog演示" />



       <Button
            android:id="@+id/button1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="AlertDialog" />



       <Button
            android:id="@+id/button2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="ProgressDialog" />



    </LinearLayout>

其运行效果如图4.41所示。

图4.41 AlertDialog的运行效果

处理AlertDialog按钮单击事件的代码为:

    btn=(Button)findViewById(R.id.button1);
            btn.setOnClickListener(new OnClickListener(){
                @Override
                public void onClick(View v){
                    // TODO Auto-generated method stub
                    showDialog(ALERT_DLG);
                }
            });

单击AlertDialog按钮,调用showDialog(ALERT_DLG),系统回调onCreateDialog(int id)方法,创建并弹出AlertDialog对话框,如图4.42所示。

图4.42 单击AlertDialog按钮的效果

相关代码为:

    protected Dialog onCreateDialog(int id){
            // TODO Auto-generated method stub
            Dialog dialog=null;
            switch(id){
            case ALERT_DLG:
                AlertDialog.Builder builder=new AlertDialog.Builder(DialogDemoActivity.this);
                builder.setIcon(android.R.drawable.ic_dialog_info);
                builder.setTitle("AlertDialog");
                builder.setMessage("这是一个AlertDialog");
                builder.setPositiveButton("Positive",new DialogInterface.OnClickListener(){



                    @Override
                    public void onClick(DialogInterface dialog, int which){
                        // TODO Auto-generated method stub
                        Log.i("DialogDemo","OK按钮被单击!");
                    }



                });
                builder.setNegativeButton("Negative",new DialogInterface.OnClickListener(){



                    @Override
                    public void onClick(DialogInterface dialog, int which){
                        // TODO Auto-generated method stub
                        Log.i("DialogDemo","Cancel按钮被单击!");
                    }



                });
                builder.setNeutralButton("Neutral",new DialogInterface.OnClickListener(){



                    @Override
                    public void onClick(DialogInterface dialog, int which){
                        // TODO Auto-generated method stub
                        Log.i("DialogDemo","Neutral按钮被单击!");
                    }



                });
                dialog=builder.create();
                break;
            default:
                break;
            }
            return dialog;
    }

onCreateDialog()方法中创建了有三个按钮的AlertDialog,并且为每个按钮添加了事件处理方法,以便获知用户单击了哪个按钮。

4.7.2 ProgressDialog

ProgressDialog是一个带有进度条的对话框,当应用程序在完成比较耗时的工作时,使用该对话框可以为用户提供一个总进度上的提示。

为main.xml布局中的ProgressDialog按钮添加事件处理代码:

    progressbtn=(Button)findViewById(R.id.button2);
            progressbtn.setOnClickListener(new OnClickListener(){



                @Override
                public void onClick(View v){
                    // TODO Auto-generated method stub
                    showDialog(PROGRESS_DLG);
                }



            });

单击ProgressDialog按钮,调用showDialog(PROGRESS_DLG),系统回调onCreateDialog(int id)方法,创建并弹出ProgressDialog对话框,如图4.43所示。

图4.43 单击ProgressDialog按钮的效果

onCreateDialog()方法中的相关代码如下:

    case PROGRESS_DLG:
                progressDialog=new ProgressDialog(this);
                //设置水平进度条
                progressDialog.setProgressStyle(progressDialog.STYLE_HORIZONTAL);
                //设置进度条最大值为100
                progressDialog.setMax(100);
                //设置进度条当前值为0
                progressDialog.setProgress(0);
                dialog=progressDialog;
                new Thread(new Runnable(){
                    int count=0;
                    @Override
                    public void run(){
                        // TODO Auto-generated method stub
                        while(progressDialog.getProgress()<100){
                            count+=3;
                            progressDialog.setProgress(count);
                            try {
                                Thread.sleep(1000);
                            } catch(InterruptedException e){
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    }



                }).start();
            break;