android-UI组件实例大全(十四)------对话框的父类:AlertDialog

来源:互联网 发布:一个人开了20家淘宝店 编辑:程序博客网 时间:2024/05/16 12:02

Android中有四种比较常用的对话框

AlertDialog:对话框的父类;ProgressDialog:进度条对话框;Date/TimePickerDialog:日期/实践选择对话框



一.普通的AlertDialog:

1.AlertDialog的结构:



2.如何创建一个AlertDialog对象:

步骤:


3.代码实现:

布局只有一个按钮,比较简单,这里就略过了

MainActivity.java

[java] view plaincopyprint?
  1. <span style="font-family:SimSun;">public class MainActivity extends Activity {  
  2.   
  3.     private Button btnshow;  
  4.     private AlertDialog.Builder build = null;  
  5.     private AlertDialog alert = null;  
  6.       
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.activity_main);  
  11.           
  12.         btnshow = (Button) findViewById(R.id.btnshow);  
  13.         btnshow.setOnClickListener(new View.OnClickListener() {  
  14.               
  15.             @Override  
  16.             public void onClick(View v) {  
  17.                 //1.创建一个AlertDialog.Builder对象  
  18.                 alert = new AlertDialog.Builder(MainActivity.this).create();  
  19.                 //当然这里也可以这样写:build = new AlertDialog.Builder(getApplicationContext());  
  20.                 //这里的话要在后面.set***吧属性设好  
  21.                   
  22.                 //2.设置图标,标题,内容  
  23.                 alert.setIcon(R.drawable.kabi);  
  24.                 alert.setTitle("系统提示:");  
  25.                 alert.setMessage("这是一个普通的AlertDialog,\n依次有取消,中立,确定按钮");  
  26.                   
  27.                 //3.设置三个按钮,可以两个或者一个,最多只能设置三个按钮哦  
  28.                 //确定按钮:  
  29.                   alert.setButton(DialogInterface.BUTTON_POSITIVE, "确定"new DialogInterface.OnClickListener() {  
  30.                     @Override  
  31.                     public void onClick(DialogInterface dialog, int which) {  
  32.                         Toast.makeText(getApplicationContext(), "你点击了确定按钮", Toast.LENGTH_SHORT).show();  
  33.                     }  
  34.                 });  
  35.                   alert.setButton(DialogInterface.BUTTON_NEGATIVE, "取消"new DialogInterface.OnClickListener() {  
  36.                     @Override  
  37.                     public void onClick(DialogInterface dialog, int which) {  
  38.                         Toast.makeText(getApplicationContext(), "你点击了取消按钮", Toast.LENGTH_SHORT).show();  
  39.                           
  40.                     }  
  41.                 });  
  42.                   alert.setButton(DialogInterface.BUTTON_NEUTRAL, "中立"new DialogInterface.OnClickListener() {  
  43.                     @Override  
  44.                     public void onClick(DialogInterface dialog, int which) {  
  45.                         Toast.makeText(getApplicationContext(), "你点击了中立按钮", Toast.LENGTH_SHORT).show();  
  46.                     }  
  47.                 });  
  48.                   //4.调用show()方法把AlertDialog显示出来  
  49.                   alert.show();    
  50.             }  
  51.         });  
  52.     }  
  53. }</span>  

运行结果:



代码解释:

1.这里的话我们是直接通过新建一个AlertDialog.Builder对象,同时调用create()方法创建了一个AlertDialog对象

2.这里要注意哦,普通按钮的监听器对象为View.OnClickListener,而AlertDialog的按钮监听器对象为DialogInterface.OnClickListener

3.按钮的话最多只能有三个,可以一个或者两个,确定,中立,取消按钮,setButton();第一个参数是决定了是哪种按钮:都是DialogInterface.****

BUTTON_POSITIVE:确定按钮        BUTTON_NEGATIVE:取消按钮         BUTTON_NEUTRAL:中立按钮

4.这里还要注意一点很容易出错的,就是

很容易出现以下错误:

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

这里的话是因为AlertDialog alert = new AlertDialog.Builder(MainActivity.this).create();

里面的这个MainActivity必须写成当前的Activity.this,不能够用getApplicationContext(),或者直接this,都会报错的哦!


源码链接:http://pan.baidu.com/s/1BZPo2


二.设置一个带列表,单选列表,多选列表的对话框

这里为了方便,就把三种对话框的实现放到一起了,这里通过三个按钮弹出对应的窗体:

代码:

main.xml布局文件就只有三个按钮,并为其设置id


MainActivity.java

[java] view plaincopyprint?
  1. <span style="font-family:Comic Sans MS;">public class MainActivity extends Activity {  
  2.   
  3.     private Button btnlist;  
  4.     private Button btnradio;  
  5.     private Button btncheck;  
  6.     private AlertDialog alert = null;  
  7.     private AlertDialog.Builder builder = null;  
  8.     private boolean[] checkItems;  
  9.       
  10.     @Override  
  11.     protected void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.activity_main);  
  14.           
  15.         btnlist = (Button) findViewById(R.id.btnlist);  
  16.         btnradio = (Button) findViewById(R.id.btnradio);  
  17.         btncheck = (Button) findViewById(R.id.btncheck);  
  18.           
  19.           
  20.         //1.这个按钮时触发一个带普通列表的AlertDialog  
  21.         btnlist.setOnClickListener(new View.OnClickListener() {       
  22.             @Override  
  23.             public void onClick(View v) {  
  24.                 final String[] lesson = new String[]{"语文","数学","英语","化学","生物","物理","体育"};  
  25.                 builder = new AlertDialog.Builder(MainActivity.this);  
  26.                 builder.setIcon(R.drawable.yibu);  
  27.                 builder.setTitle("请选择你喜欢的课程");  
  28.                 builder.setItems(lesson, new DialogInterface.OnClickListener() {  
  29.                       
  30.                     @Override  
  31.                     public void onClick(DialogInterface dialog, int which) {  
  32.                         Toast.makeText(getApplicationContext(), "你选择了"+lesson[which],Toast.LENGTH_SHORT).show();  
  33.                     }  
  34.                 });  
  35.                 alert = builder.create();  
  36.                 alert.show();  
  37.             }  
  38.         });  
  39.           
  40.         //2.这个按钮是触发一个带单选列表的AlertDialog  
  41.         btnradio.setOnClickListener(new View.OnClickListener() {  
  42.               
  43.             @Override  
  44.             public void onClick(View v) {  
  45.                 final String[] fruits = new String[]{"苹果","雪梨","香蕉","葡萄","西瓜"};  
  46.                 builder = new AlertDialog.Builder(MainActivity.this);  
  47.                 builder.setIcon(R.drawable.leiyibu);  
  48.                 builder.setTitle("请选择你喜欢的水果,只能选一个哦!");  
  49.                 builder.setSingleChoiceItems(fruits, 0new DialogInterface.OnClickListener() {  
  50.                       
  51.                     @Override  
  52.                     public void onClick(DialogInterface dialog, int which) {  
  53.                         Toast.makeText(getApplicationContext(), "你选择了"+fruits[which], Toast.LENGTH_SHORT).show();  
  54.                     }  
  55.                 });  
  56.                 builder.setPositiveButton("确定"null);  
  57.                 alert = builder.create();  
  58.                 alert.show();  
  59.             }  
  60.         });  
  61.           
  62.         //3.这个按钮时触发一个带多选按钮的AlertDialog  
  63.         btncheck.setOnClickListener(new View.OnClickListener() {  
  64.               
  65.             @Override  
  66.             public void onClick(View v) {  
  67.                 final String[] menu = new String[]{"水煮豆腐","萝卜牛腩","葱爆瘦肉"};  
  68.                 //定义一个用来记录个列表项状态的boolean数组  
  69.                 checkItems = new boolean[]{false,false,false};  
  70.                   
  71.                 builder = new AlertDialog.Builder(MainActivity.this);  
  72.                 builder.setIcon(R.drawable.huoyibu);  
  73.                 builder.setTitle("点选你喜欢的菜肴:");  
  74.                 builder.setMultiChoiceItems(menu, checkItems, new OnMultiChoiceClickListener() {  
  75.                       
  76.                     @Override  
  77.                     public void onClick(DialogInterface dialog, int which, boolean isChecked) {  
  78.                         // TODO Auto-generated method stub  
  79.                         checkItems[which] = isChecked;  
  80.                     }  
  81.                 });  
  82.                 //为对话框添加确定按钮:  
  83.                 builder.setPositiveButton("确定"new DialogInterface.OnClickListener() {  
  84.                       
  85.                     @Override  
  86.                     public void onClick(DialogInterface dialog, int which) {  
  87.                         String result = "";  
  88.                         for(int i = 0;i < checkItems.length;i++)  
  89.                         {  
  90.                             if(checkItems[i])  
  91.                                 result += menu[i]+" ";  
  92.                         }  
  93.                         Toast.makeText(getApplicationContext(),"客官你点了:"+result, Toast.LENGTH_SHORT).show();  
  94.                     }  
  95.                 });  
  96.                   
  97.                 builder.create().show();  
  98.             }  
  99.         });  
  100.     }  
  101. }  
  102. </span>  

运行截图:



代码解释:

1.这几个的区别主要是设置内容那里,普通的是setItem();单选按钮时setSingleChoiceItems;复选框是setMultiChoiceItems();

2.这里的setOnClickListener 是DialogInterface.OnClickListener,而非View的那个

3.第三个复选框我们是通过boolean数组判断是否选中的,确定按钮中的触发事件是:OnMultiChoiceClickListener,参数依次为显示

  的数组,boolean的状态数组

4.boolean写成Boolean是会报错的哦!!!!


源码下载:http://pan.baidu.com/s/1y2FlK



三.自定义一个AlertDialog:

main.xml中只定义一个简单的按钮

首先,自定义一个我们想要的布局,我们这里做的是一个登陆的布局

login.xml:

[html] view plaincopyprint?
  1. <span style="font-family:Comic Sans MS;"><?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.     <TableRow>  
  7.         <TextView  
  8.             android:layout_width="match_parent"  
  9.             android:layout_height="wrap_content"  
  10.             android:text="账号:"  
  11.             android:textSize="15sp"  
  12.         />  
  13.         <EditText   
  14.             android:id="@+id/txtname"  
  15.             android:layout_width="match_parent"  
  16.             android:layout_height="wrap_content"  
  17.             android:hint="请输入您的账号:     "  
  18.             android:selectAllOnFocus="true"  
  19.         />  
  20.     </TableRow>  
  21.     <TableRow>  
  22.         <TextView  
  23.             android:layout_width="match_parent"  
  24.             android:layout_height="wrap_content"  
  25.             android:text="密码:"  
  26.             android:textSize="12sp"  
  27.         />  
  28.         <EditText   
  29.             android:id="@+id/txtpassword"  
  30.             android:layout_width="match_parent"  
  31.             android:layout_height="wrap_content"  
  32.             android:hint="请输入您的密码:    "  
  33.             android:password="true"  
  34.         />  
  35.     </TableRow>  
  36.       
  37.   
  38. </TableLayout></span>  


解释:这些属性在前面的组件都有的,不会的可以查看前面的博文



接着,就是MainActivity.java,其实自定义和普通的区别就是用了setView方法,我们只需要为login布局创建一个view即可

这里的话用到inflate动态加载布局

代码如下:

[java] view plaincopyprint?
  1. <span style="font-family:Comic Sans MS;">public class MainActivity extends Activity {  
  2.   
  3.     private Button btnshow;  
  4.     private AlertDialog.Builder build = null;  
  5.     private EditText edit;  
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.activity_main);  
  10.           
  11.         btnshow = (Button) findViewById(R.id.btnshow);  
  12.         btnshow.setOnClickListener(new OnClickListener() {  
  13.               
  14.             @Override  
  15.             public void onClick(View v) {  
  16.                 TableLayout table = (TableLayout) getLayoutInflater().inflate(R.layout.login, null);  
  17.                 edit = (EditText) table.findViewById(R.id.txtname);  
  18.                 build = new AlertDialog.Builder(MainActivity.this);  
  19.                 build.setIcon(R.drawable.pipi);  
  20.                 build.setTitle("登陆界面:");  
  21.                 build.setView(table);  
  22.                 build.setPositiveButton("登陆"new DialogInterface.OnClickListener() {  
  23.                       
  24.                     @Override  
  25.                     public void onClick(DialogInterface dialog, int which) {  
  26.                         Toast.makeText(getApplicationContext(), "欢迎你"+edit.getText(), Toast.LENGTH_SHORT).show();  
  27.                     }  
  28.                 });  
  29.                 build.setNegativeButton("取消"new DialogInterface.OnClickListener() {  
  30.                       
  31.                     @Override  
  32.                     public void onClick(DialogInterface dialog, int which) {  
  33.                         Toast.makeText(getApplicationContext(), "感谢您的使用!", Toast.LENGTH_SHORT).show();  
  34.                     }  
  35.                 });  
  36.   
  37.                 build.create().show();  
  38.             }  
  39.         });  
  40.     }  
  41.   
  42. }  
  43. </span>  

运行截图:



代码解释:

1.这里的话要注意动态加载布局那里,

TableLayout table = (TableLayout) getLayoutInflater().inflate(R.layout.login, null);
edit = (EditText) table.findViewById(R.id.txtname);

因为我们想获取的是login的布局中的EditText的文本内容,这里findViewByid的话要在前面加上这个动态布局的table.FindViewById.不然会报空指针异常

2.再次说明一下,我们自定义布局的核心是Builder类的setView()方法,只要实例化一个View放进去即可



程序源码:http://pan.baidu.com/s/1ziCsP


0 0
原创粉丝点击