对话框

    Android提供了丰富的电话框支持,它提供了如下4种常用的对话框。

  •  AlertDialog:功能最丰富、实际应用最广的对话框。
  • ProgressDialog:进度对话框,这个对话框只是对简单进度条的封装。
  • DatePickerDialog:日期选择对话框,这个对话框只是对DataPicker的包装。
  • TimerPickerDialog:时间选择对话框,这个对话框只是对TimePicker的包装。

    上面4种对话框中功能最强、用户最灵活的就是AlertDialog,因此应用也非常广泛,而其他三种对话框都是它的子类。

本节将会详细介绍各种对话框的功能和用法。

    使用AlertDialog创建对话框

    AlertDialog的功能很强大,它可以生成各种内容的对话框。但实际上AlertDialog生成的对话框总有如下结构。

    AlertDialog生辰的对话框可分为如下4个区域。

  • 图标区。
  • 标题区。
  • 内容区。
  • 按钮区。

   从上面对话框的结构来看,创建一个对话框需要如下几步。

  1. 使用创建AlertDialog.Builder对象。
  2. 调用AlertDialog.Builder的setTitile或setCustomTitle()方法设置标题。
  3. 调用AlertDialog.Builder的setIcon()方法设置图标。
  4. 调用AlertDialog.Builder的相关方法设置对话框内容。
  5. 调用AlertDialog.Builder的setPositiveButton()、setNegativeButton()或setNeutralButton()方法添加多个按钮。
  6. 调用AlertDialog.Builder的create()方法创建AlertDialog对象,再调用AlertDialog对象的show()方法将该对话框显示出来。

      上面的6个步骤中,第4个步骤是最灵活的,AlertDialog允许创建各种内容的对话框。归纳起来,AlertDialog提供了如下6种方法来指定对话框的内容。

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

      下面通过几个实例来介绍AlertDialog的用法。

     实例:显示提示消息对话框

       本程序的界面非常简单,程序上面定义了一个文本框和6个按钮,每次用户单击一个按钮时,将会显示不同类型的对话框。

       界面布局文件如下:

       

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
     >
<!-- 显示一个普通的文本编辑框组件 -->
<EditText android:id="@+id/show"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:editable="false" />
<!-- 定义一个普通的按钮组件 -->
<Button android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="简单按钮"
    android:onClick="simple"/>
<!-- 定义一个普通的按钮组件 -->
<Button android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="简单列表项按钮"
    android:onClick="simpleList"/>
<!-- 单选列表项组件 -->
<Button android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="单选列表项对话框"
    android:onClick="singleChoice" />
<!-- 多选列表项对话框 -->
<Button android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="多选列表项对话框"
    android:onClick="multiChoice" />
<!-- 自定义列表项对话框 -->
<Button android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="自定义列表项对话框"
    android:onClick="customList" />
<!-- 自定义View对话框 -->
<Button android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="自定义View的对话框"
    android:onClick="customView" />
</LinearLayout>

后台文件如下:
  

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();
    }

    上面的程序中粗体字代码为该对话框设置了图标、标题等属性,上面的程序中还调用了setPositiveButton()和setNegativeButton()方法添加按钮。这两个方法的代码如下。

private AlertDialog.Builder setPositiveButton(AlertDialog.Builder builder)
    {
       //调用setPositiveButton方法添加“确定”按钮
        return builder.setPositiveButton("确定", new OnClickListener(){

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

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                show.setText("单击了【取消】按钮");
            }
            
        });
        
    }

   除此之外,AlertDialog.Builder还提供了如下方法来添加按钮。

   setNeutralButton(CharSequence text,DialogInterface.OnClickListener listener):添加一个装饰性按钮。

   运行上面的程序,单击程序中“简单对话框”按钮,将看到如图所示效果。

 

  实例:简单列表项对话框

  AlertDialog.Builder调用setItems()方法即可设置简单列表项的对话框,调用该方法时需要传入一个数组或数组资源的资源ID。

   下面的代码调用setItems()来设置简单列表项对话框,程序代码如下。

  

 String[] items=new String[]{"疯狂Java讲义",
           "疯狂Ajax讲义",
           "轻量级JavaEE企业应用实战",
           "疯狂Android讲义"}; 

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) {
                // TODO Auto-generated method stub
                show.setText("你选中了《"+items[which]+"》");
            }
        });
        //为AlertDialog.Builder添加“确定”按钮
        setPositiveButton(builder);
        //为AlertDialog.Builder添加“取消”按钮
        setNegativeButton(builder).create().show();
    }

    上面的程序中粗体字代码调用AlertDialog.Builder的setItems()方法为对话框设置了多个列表项,此处生成了4个普通列表项。
     运行上面的程序后单击“简单列表项对话框”按钮,程序将显示下图所示的界面。

   

    实例:单选列表项对话框

     只要调用AlertDialog.Builder的setSingleChoiceItems()方法即可创建带单选列表项的对话框。调用setSingleChoiceItems()方法时既可传入数组做为参数,也可传入Cursor(相当于数据库查询结果集)作为参数,也可传入ListAdapter作为参数。如果传入ListAdapter作为参数,则由ListAdapter来提供多个列表项组件。

    后台代码文件如下:

   

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) {
                // TODO Auto-generated method stub
                show.setText("你选中了《"+items[which]+"》");
            }
        });
        //为AlertDialog.Builder添加“确定”按钮
        setPositiveButton(builder);
        //为AlertDialog.Builder添加“取消”按钮
        setNegativeButton(builder).create().show();
    }

运行上面的程序,单击“单选列表项对话框”按钮,应用显示下图所示状况。
 

  实例:多选列表项对话框

    只要调用AlertDialog.Builder的setMultieChoiceItems()方法即可创建一个多选列表的对话框。调用setMultieChoiceItems()方法时即可传入数组作为参数,也可传入Cursor(相当于数据库查询结果集)作为参数。

   下面的方法调用了setMultieChoiceItems()方法来创建带多选列表项的对话框。

   后台代码文件如下:

//多选列表项对话框
    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();
    }

调用AlertDialog.Builder的setMultiChoiceItems()方法添加多选列表时,需要传入一个boolean[]参数,该参数有两个作用:①设置初始化时选中那些列表项。②该boolean[]类型的参数还可用于动态的获取多选列表中列表项的选中状态。
   运行上面的程序,然后单击“多选列表项对话框”按钮,程序将显示如图所示的界面。

 实例:自定义列表项对话框 

    AlertDialog.Builder提供了一个setAdapter()方法来设置对话框的内容,该方法需要传入一个Adapter参数,这样即可由该Adapter负责提供多个列表项组件。

    提示:不仅setAdapter()方法可以接受Adapter作为参数,setSingleChoice()方法也可以接受Adapter作为参数,这意味着调用setSingleChoice()方法也可实现自定义列表项对话框。

    下面的方法调用了setAdapter()方法来创建自定义列表项的对话框。

    

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

上面的程序中粗体字代码调用setAdapter()方法时传入了一个ArrayAdapter,该ArrayAdapter将会负责提供多个自定义列表项。如果需要,完全可以用创建SimpleAdapter对象或扩展BaseAdapter的方法来实现Adapter,并作为参数传入setAdapter()方法。
   其中上面代码中的R.layout.array_item的布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/TextView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="24dp"
    android:padding="10px"
    android:shadowColor="#f0f"
    android:shadowDx="4"
    android:shadowDy="4"
    android:shadowRadius="2" >
</TextView>

 

   运行上面的程序,然后单击“自定义列表项对话框”按钮,程序将显示如图所示的界面。

 

 实例:自定义View的对话框

   AlertDialog.Builder的setView()方法可以接受一个View组件,该View组件将会作为对话框的内容,通过这种方式,开发者可以“随心所欲”地定制对话框的内容——因为在Android界面编程中,一切都是View。本实例将会定义一个登录对话框,为实现该登录对话框,先定义一个登录的界面布局,该界面布局文件如下。

 

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/loginForm"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <TableRow >
        <TextView android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="用户名:"
            android:textSize="10pt"/>
        <!-- 输入用户名的文本框 -->
        <EditText android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="请填写登录账号"
            android:selectAllOnFocus="true"/>
    </TableRow>
    <TableRow >
        <TextView android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="密码:"
             android:textSize="10pt"
           />
        <!-- 输入密码的文本框 -->
        <EditText android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="请填写密码"/>
    </TableRow>
    <TableRow >
        <TextView android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="电话号码:"
            android:textSize="10pt"/>
        <!-- 输入电话号码的文本框 -->
        <EditText android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="请填写您的电话号码"
            android:selectAllOnFocus="true"
            android:phoneNumber="true"/>
    </TableRow>
</TableLayout>

上面的界面布局中定义了登录用的三个输入框:输入用户名的文本框、输入密码的密码框、输入电话号码的输入框。接下来在应用程序中调用AletDialog.Builder的setView(View view)方法让对话框显示该输入界面即可。

   该程序与前面介绍的列表对话框的内容比较相似,只是将原来的调用setItems()设置列表项,改为现在的调用setView()来设置自定义视图。下面给出该程序的关键代码。

//自定义View对话框
    public void customView(View source)
    {
        //装载/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) {
                // TODO Auto-generated method stub
                
            }
        })
        //为该对话框设置一个“取消”按钮
        .setNegativeButton("取消", new OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                
            }
        })
        //创建并显示对话框
        .create()
        .show();
        
    }

   上面的程序中第一行粗体字代码显示装载了/res/layout/login.xml文件,并返回该文件对应的TableLayout作为View,接下来程序调用了AlertDialog.Builder的setVIew()方法来显示上一行代码所获得的TableLayot。

   运行上面的程序,然后单击“自定义View对话框”按钮,应用程序将显示如图所示的效果。

 

 

 

    

   

    

   

posted @ 2013-10-28 21:33  TealerProg  Views(571)  Comments(0Edit  收藏  举报