当前位置: 代码迷 >> Android >> Android对话框使用详解(1)
  详细解决方案

Android对话框使用详解(1)

热度:70   发布时间:2016-04-28 00:47:39.0
Android对话框使用详解(一)
    Android应用主要有4种类型对话框,分别为AlertDialog、ProgressDialog、DataPickerDialog、TimePickerDialog,其中后三种都是继承于AlertDialog。简要介绍如下:
    AlertDialog:功能最丰富、实用最广的对话框;
    ProgressDialog:进度条对话框;
    DatePickerDialog:日期选择对话框,是对DatePicker的包装;
    TiemPickerDialog:时间选择对话框,是对TimePicker的包装。
转载标明博客:http://blog.csdn.net/u012637501
AlertDialog使用详解
    使用AlertDialog,可以创建各种功能和风格的对话框。开发的主要步骤如下:
    (1)使用创建AlertDialog.Builder对象,其中Builder为AlertDialog内部静态类,提供对话框的具体实现方法;
    (2)调用AlertDialog.Builder的setTitle()或setCustomTitle()方法设置标题、setIcon()方法设置标题;
    (3)调用AlertDialog.Builder的setCancelable()设置触屏不取消、setMessage()设置对话框内容;
    (4)调用AlertDialog.Builder的setPositiveButton()、setNegativeButton()或setNeutralButton()方法添加多个按钮。
    (5)调用AlerDialog.Buidler的create()方法创建AlertDailog对象,再调用AlertDialog对象的show()方法将对话框显示出来。
1.创建显示提示消息的对话框
    该类型对话框可以只是显示对话框消息,也可以为按钮注册监听器实现相应的功能。
(1)对话框样式

(2)代码实现
  1. AlertDialog.Builder builder = new AlertDialog.Builder(context);  
  2.    builder.setTitle("网络设置提示")  
  3.       .setIcon(R.drawable.dialog);  
  4.       .setMessage("网络异常,设置网络?")  
  5.       .setPositiveButton("是"new DialogInterface.OnClickListener() {  
  6.             public void onClick(DialogInterface dialog, int which) {   
  7.                 //..............功能代码................//  
  8.                 }  
  9.        })  
  10.      .setNegativeButton("否",  new DialogInterface.OnClickListener() {   
  11.             public void onClick(DialogInterface dialog,  int which) {   
  12.              //..............功能代码................//  
  13.              //dialog.dismiss();  
  14.             }  
  15.        })  
  16.        .create()  
  17.        .show();
2.创建简单列表项对话框(which为列表索引)
    AlertDialog.Builder调用setItems()方法即可设置简单列表项对话框,需要注意的是调用该方法时需要传入一个数组或数组资源的ID,其中参数which为选择哪一项编号。
(1)对话框样式

(2)代码实现
  1. final CharSequence[]  items = new CharSequence[] {"星期一","星期二","星期三","星期四","星期五"};  
  2.  AlertDialog.Builder builder = new AlertDialog.Builder(this);  
  3.   builder.setTitle("时间表")  
  4.      .setIcon(R.drawable.dialog_icon)  
  5.      .setCancelable(false)  
  6.      //简单列表对话框  
  7.      .setItems(items, new OnClickListener() {  
  8.       public void onClick(DialogInterface dialog, int which) {  
  9.                Toast.makeText(MainActivity.this"今天是:"+items[which], Toast.LENGTH_SHORT).show();  
  10.           }  
  11.      })  
  12.      /** 
  13.       * 确认按钮 
  14.       * */  
  15.      .setPositiveButton("是",new DialogInterface.OnClickListener() {  
  16.                public void onClick(DialogInterface dialog,int which) {  
  17.                 //.......功能代码  
  18.            }  
  19.       })  
  20.      /** 
  21.       * 取消按钮 
  22.       * */  
  23.     .setNegativeButton("否",new DialogInterface.OnClickListener() {  
  24.            public void onClick(DialogInterface dialog,int which) {  
  25.                     dialog.dismiss();  
  26.                }  
  27.       }).create().show();   
3.创建单选列表项对话框(which为列表索引)
    AlertDialog.Builder调用setSingleChoiceItems()方法即可创建带单选列表项的对话框。调用setSingleChoiceItems()方法时可传入数组或数组资源的ID、或Cursor(相当于数据库查询结果集)、或ListAdapter作为参数。如果传入ListAdapter作为参数,则由ListAdapter来提供多个列表项组件,也相当于自定义布局对话框。
(1)对话框样式

(2)代码实现
  1. final CharSequence[]  items = new CharSequence[] {"星期一","星期二","星期三","星期四","星期五"};  
  2.  AlertDialog.Builder builder = new AlertDialog.Builder(this);  
  3.   builder.setTitle("时间表")  
  4.      .setIcon(R.drawable.dialog_icon)  
  5.      .setCancelable(false)  
  6.       //设置单选列表项,默认选中第二项(索引为1)  
  7.      .setSingleChoiceItems(items, 1new OnClickListener(){  
  8.       public void onClick(DialogInterface dialog, int which) {  
  9.        Toast.makeText(MainActivity.this"今天是:"+items[which], Toast.LENGTH_SHORT).show();  
  10.       }  
  11.      })  
  12.      /** 
  13.       * 确认按钮 
  14.       * */  
  15.      .setPositiveButton("是",new DialogInterface.OnClickListener() {  
  16.                public void onClick(DialogInterface dialog,int which) {  
  17.                 //.......功能代码  
  18.            }  
  19.       })  
  20.      /** 
  21.       * 取消按钮 
  22.       * */  
  23.     .setNegativeButton("否",new DialogInterface.OnClickListener() {  
  24.            public void onClick(DialogInterface dialog,int which) {  
  25.                     dialog.dismiss();  
  26.                }  
  27.       }).create().show();  
注意:setSingleChoiceItems方法中参数1表示默认选中的对话框列表的第二项。

4.创建多选列表项对话框
    AlertDialog.Builder调用setMultieChoiceItems()方法即可创建一个多选列表的对话框。调用setMultieChoiceItems()方法时可传入数组、或Cursor(相当于数据库查询结果集)作为参数。
    AlertDialog.Builder.setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems, OnMultiChoiceClickListener listener)
注意:boolean[]参数主要用于(1)设置初始化时选中哪些列表项;(2)该boolean类型的参数还可用于动态获取选择列表中列表项的选中状态。
(1)对话框样式

(2)代码实现
  1. final CharSequence[]  items = new CharSequence[] {"星期一","星期二","星期三","星期四","星期五"};  
  2.  AlertDialog.Builder builder = new AlertDialog.Builder(this);  
  3.   builder.setTitle("时间表")  
  4.      .setIcon(R.drawable.dialog_icon)  
  5.      .setCancelable(false)  
  6.     //设置多选列表项,默认勾选第2项、第4项  
  7.      .setMultiChoiceItems(items, new boolean[]{false,true,false,true,false},null)  
  8.      /** 
  9.       * 确认按钮 
  10.       * */  
  11.      .setPositiveButton("是",new DialogInterface.OnClickListener() {  
  12.                public void onClick(DialogInterface dialog,int which) {  
  13.                 //.......功能代码  
  14.            }  
  15.       })  
  16.      /** 
  17.       * 取消按钮 
  18.       * */  
  19.     .setNegativeButton("否",new DialogInterface.OnClickListener() {  
  20.            public void onClick(DialogInterface dialog,int which) {  
  21.                     dialog.dismiss();  
  22.                }  
  23.       }).create().show();   
5.创建自定义对话框
    AlertDialog.Builder提供了一个setAdapter()方法来设置对话框的内容,该方法需要传入一个Adapter参数,这样即可由该Adapter负责提供多个列表项组件。
(1)对话框样式

(2)代码实现
  1. //创建用到的资源  
  2.      final String[]  names = new String[] {"毛泽东","邓小平","周恩来","朱镕基","习近平"};  
  3.      final String[] descs = new String[]{"中华人民共和国开国领袖","改革开放领路人","敬爱的周总理","中国最具影响力总理之一","中国梦领路人"};  
  4.      final int[] imageIds = new int[]{R.drawable.image01,R.drawable.image02,R.drawable.image03,R.drawable.image04,R.drawable.image05};  
  5.      //创建一个List集合,List集合的元素是Map对象  
  6.      List<Map<String,Object>> listItems = new ArrayList<Map<String,Object>>();  
  7.      for(int i=0;i<names.length;i++){  
  8.       Map<String,Object> listItem = new HashMap<String,Object>();  
  9.       listItem.put("imageRes", imageIds[i]);  
  10.       listItem.put("personName",names[i]);  
  11.       listItem.put("desc", descs[i]);  
  12.       listItems.add(listItem);  
  13.      }    
  14.      //创建一个SimpleAdapter  
  15.   SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this,  
  16.     listItems, R.layout.listline, new String[] { "personName",  
  17.       "imageRes""desc" }, new int[] { R.id.name,  
  18.       R.id.header, R.id.desc });  
  19.    
  20.      AlertDialog.Builder builder = new AlertDialog.Builder(this);  
  21.       builder.setTitle("时间表")  
  22.      .setIcon(R.drawable.dialog_icon)  
  23.      .setCancelable(false)  
  24.      //自定义对话框  
  25.        
  26.      .setAdapter(simpleAdapter, new OnClickListener() {  
  27.       public void onClick(DialogInterface dialog, int which) {  
  28.            Toast.makeText(MainActivity.this"您点击了第:"+which+"项", Toast.LENGTH_SHORT).show();  
  29.       }  
  30.      })  
  31.      /** 
  32.       * 确认按钮 
  33.       * */  
  34.      .setPositiveButton("是",new DialogInterface.OnClickListener() {  
  35.        public void onClick(DialogInterface dialog,int which) {  
  36.         //.......功能代码  
  37.        }  
  38.       })  
  39.      /** 
  40.       * 取消按钮 
  41.       * */  
  42.     .setNegativeButton("否",new DialogInterface.OnClickListener() {  
  43.        public void onClick(DialogInterface dialog,int which) {  
  44.         dialog.dismiss();  
  45.        }  
  46.       }).create().show();  
其中,列表项布局文件R.layout.listline.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:orientation="horizontal">  
  6.     <!-- 定义一个ImageView,用于作为列表项的一部分 -->  
  7.     <ImageView   
  8.         android:id="@+id/header"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:paddingLeft="10dp"/>  
  12.     <LinearLayout   
  13.         android:layout_width="match_parent"  
  14.         android:layout_height="wrap_content"  
  15.         android:orientation="vertical">  
  16.      <!-- 定义一个TextView,用于作为列表项的一部分 -->  
  17.      <TextView   
  18.          android:id="@+id/name"  
  19.          android:layout_width="wrap_content"  
  20.          android:layout_height="wrap_content"  
  21.          android:textSize="20dp"  
  22.          android:textColor="#f0f"  
  23.          android:paddingLeft="10dp"/>     
  24.          <!-- 定义一个TextView,用于作为列表项的一部分  -->  
  25.          <TextView   
  26.              android:id="@+id/desc"  
  27.              android:layout_width="wrap_content"  
  28.              android:layout_height="wrap_content"  
  29.              android:textSize="14dp"  
  30.              android:textColor="#f00"  
  31.              android:paddingLeft="10dp"/>  
  32.     </LinearLayout>  
  33. </LinearLayout>  
注释:创建SimpleAdapter对象,需要传入五个参数
    SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
    (1)第1个参数:为上下文
    (2)第2个参数:为List<Map<String,?>>类型的集合对象,该集合中每个Map<String,?>对象生成一个列表项
    (3)第3个参数:该参数指定一个界面布局ID,如 R.layout.listline.xml用作于列表组件
    (4)第4个参数:该参数是一个String[]类型的参数,该参数决定提取Map<String,?>对象中哪些key对应的value来生成列表项
    (5)第5个参数:该参数应该是一个int[]类型的参数,该参数决定填充列表项布局的哪个组件。
    当然,我们也可以使用ArrayAdapter构造一个简单的列表项(只包含文本),虽然只是显示文本,但是相比使用setItems(items,listener)等方法创建列表对话框来说,可以通过setAdapter(adapter,listener)方法设置列表对话框文本显示的风格,比如字体大小、颜色、文本边距等。使用方法如下:
    String[]  names = new String[] {"毛泽东","邓小平","周恩来"};                                                               //数组资源
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,R.layout.listline,names);    //将数组包装为
    builder.setAdapter(adapter,listener);
其中,列表项布局文件R.layout.listline.xml        
    <?xml version="1.0" encoding="utf-8"?>
    <TextView  xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/name"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:textSize="20dp"
         android:textColor="#f0f"
         android:paddingLeft="10dp"/>
效果如下:

6.自定义View(窗口)的对话框
    AlertDialog.Builder的setView()方法可以接收一个View组件,该View组件将会作为对话框的内容。由于在Android界面编程中,一切组件继承于View,因此,我们可以使用这种方法实现各种高级的对话框。
1.对话框样式

2.代码实现
    
  1.  //创建View对话框  
  2.      TableLayout loginView = (TableLayout) getLayoutInflater().inflate(R.layout.login, null);     
  3.      AlertDialog.Builder builder = new AlertDialog.Builder(this);  
  4.   builder.setTitle("用户登录")  
  5.      .setIcon(R.drawable.dialog_icon)  
  6.      .setCancelable(false)  
  7.      .setView(loginView)  
  8.      /** 
  9.       * 确认按钮 
  10.       * */  
  11.      .setPositiveButton("是",new DialogInterface.OnClickListener() {  
  12.        public void onClick(DialogInterface dialog,int which) {  
  13.         //.......功能代码  
  14.        }  
  15.       })  
  16.      /** 
  17.       * 取消按钮 
  18.       * */  
  19.     .setNegativeButton("否",new DialogInterface.OnClickListener() {  
  20.        public void onClick(DialogInterface dialog,int which) {  
  21.         dialog.dismiss();  
  22.        }  
  23.       }).create().show();   
注意:getLayoutInflater().inflate(R.layout.login, null)目前是从指定的xml文件获取资源,填充到指定View组件中。
    其中,R.layout.login.xml文件内容为:
  1. <?xml version="1.0"  encoding="utf-8"?>  
  2. <TableLayout  xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical">  
  6.     <!-- 用户名行 -->  
  7.     <TableRow >  
  8.         <TextView  
  9.             android:layout_width="fill_parent"  
  10.             android:layout_height="wrap_content"  
  11.             android:layout_weight="2"  
  12.             android:text="       用户名"  
  13.             android:textSize="20sp"/>  
  14.         <EditText  
  15.             android:id="@+id/uerName"  
  16.             android:layout_width="fill_parent"  
  17.             android:layout_height="wrap_content"  
  18.             android:layout_weight="3"  
  19.             android:hint="请填写登录帐号"  
  20.             android:textSize="15sp"  
  21.             android:selectAllOnFocus="true"/>  
  22.     </TableRow>  
  23.      
  24.        <!-- 密码行 -->  
  25.     <TableRow >  
  26.         <TextView  
  27.             android:layout_width="fill_parent"  
  28.             android:layout_height="wrap_content"  
  29.             android:layout_weight="2"  
  30.             android:text="       密  码"  
  31.             android:textSize="20sp"/>  
  32.         <EditText  
  33.             android:id="@+id/password"  
  34.             android:layout_width="fill_parent"  
  35.             android:layout_height="wrap_content"  
  36.             android:layout_weight="3"  
  37.             android:hint="请输入密码"  
  38.             android:textSize="15sp"  
  39.             android:selectAllOnFocus="true"/>  
  40.     </TableRow>  
  41.      
  42.        <!-- 电话号码行 -->  
  43.     <TableRow >  
  44.         <TextView  
  45.             android:layout_width="fill_parent"  
  46.             android:layout_height="wrap_content"  
  47.             android:layout_weight="2"  
  48.             android:text="      联系电话"  
  49.             android:textSize="20sp"/>  
  50.         <EditText  
  51.             android:layout_width="fill_parent"  
  52.             android:layout_height="wrap_content"  
  53.             android:layout_weight="3"  
  54.             android:textSize="15sp"  
  55.             android:hint="请输入电话号码..."  
  56.             android:selectAllOnFocus="true"/>  
  57.     </TableRow>  
  58. </TableLayout>  

7.使用Activity作为对话框显示
(1)对话框样式

(2)代码实现
第一步:实现一个Activity
  1. public class DialogActivity extends Activity {  
  2.  @Override  
  3.  protected void onCreate(Bundle savedInstanceState) {  
  4.   super.onCreate(savedInstanceState);  
  5.   setContentView(R.layout.dialog);  
  6.  }  
  7.  public void cancelDialog(View v){  
  8.       finish();  //结束Activity  
  9.  }  
  10. }
其中,Activity界面布局文件dialog.xml为
  1. <?xml version="1.0"  encoding="utf-8"?>  
  2. <LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:orientation="vertical">  
  6.         <ImageView  
  7.             android:layout_width="fill_parent"  
  8.             android:layout_height="wrap_content"  
  9.             android:src="@drawable/hehe" />  
  10.         <Button   
  11.             android:onClick="cancelDialog"  
  12.             android:layout_width="fill_parent"  
  13.             android:layout_height="wrap_content"  
  14.      android:text="取  消"/>  
  15. </LinearLayout> 
第二步:在工程文件中定义该Activity并设置主题为对话框风格
  
  1.  <activity  
  2.                android:name=".DialogActivity"  
  3.                android:theme="@android:style/Theme.Dialog"/>  
  相关解决方案