android-UI组件实例大全(十四)------对话框的父类:AlertDialog
来源:互联网 发布:一个人开了20家淘宝店 编辑:程序博客网 时间:2024/05/16 12:02
Android中有四种比较常用的对话框
AlertDialog:对话框的父类;ProgressDialog:进度条对话框;Date/TimePickerDialog:日期/实践选择对话框
一.普通的AlertDialog:
1.AlertDialog的结构:
2.如何创建一个AlertDialog对象:
步骤:
3.代码实现:
布局只有一个按钮,比较简单,这里就略过了
MainActivity.java
- <span style="font-family:SimSun;">public class MainActivity extends Activity {
- private Button btnshow;
- private AlertDialog.Builder build = null;
- private AlertDialog alert = null;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- btnshow = (Button) findViewById(R.id.btnshow);
- btnshow.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- //1.创建一个AlertDialog.Builder对象
- alert = new AlertDialog.Builder(MainActivity.this).create();
- //当然这里也可以这样写:build = new AlertDialog.Builder(getApplicationContext());
- //这里的话要在后面.set***吧属性设好
- //2.设置图标,标题,内容
- alert.setIcon(R.drawable.kabi);
- alert.setTitle("系统提示:");
- alert.setMessage("这是一个普通的AlertDialog,\n依次有取消,中立,确定按钮");
- //3.设置三个按钮,可以两个或者一个,最多只能设置三个按钮哦
- //确定按钮:
- alert.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Toast.makeText(getApplicationContext(), "你点击了确定按钮", Toast.LENGTH_SHORT).show();
- }
- });
- alert.setButton(DialogInterface.BUTTON_NEGATIVE, "取消", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Toast.makeText(getApplicationContext(), "你点击了取消按钮", Toast.LENGTH_SHORT).show();
- }
- });
- alert.setButton(DialogInterface.BUTTON_NEUTRAL, "中立", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Toast.makeText(getApplicationContext(), "你点击了中立按钮", Toast.LENGTH_SHORT).show();
- }
- });
- //4.调用show()方法把AlertDialog显示出来
- alert.show();
- }
- });
- }
- }</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
- <span style="font-family:Comic Sans MS;">public class MainActivity extends Activity {
- private Button btnlist;
- private Button btnradio;
- private Button btncheck;
- private AlertDialog alert = null;
- private AlertDialog.Builder builder = null;
- private boolean[] checkItems;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- btnlist = (Button) findViewById(R.id.btnlist);
- btnradio = (Button) findViewById(R.id.btnradio);
- btncheck = (Button) findViewById(R.id.btncheck);
- //1.这个按钮时触发一个带普通列表的AlertDialog
- btnlist.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- final String[] lesson = new String[]{"语文","数学","英语","化学","生物","物理","体育"};
- builder = new AlertDialog.Builder(MainActivity.this);
- builder.setIcon(R.drawable.yibu);
- builder.setTitle("请选择你喜欢的课程");
- builder.setItems(lesson, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Toast.makeText(getApplicationContext(), "你选择了"+lesson[which],Toast.LENGTH_SHORT).show();
- }
- });
- alert = builder.create();
- alert.show();
- }
- });
- //2.这个按钮是触发一个带单选列表的AlertDialog
- btnradio.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- final String[] fruits = new String[]{"苹果","雪梨","香蕉","葡萄","西瓜"};
- builder = new AlertDialog.Builder(MainActivity.this);
- builder.setIcon(R.drawable.leiyibu);
- builder.setTitle("请选择你喜欢的水果,只能选一个哦!");
- builder.setSingleChoiceItems(fruits, 0, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Toast.makeText(getApplicationContext(), "你选择了"+fruits[which], Toast.LENGTH_SHORT).show();
- }
- });
- builder.setPositiveButton("确定", null);
- alert = builder.create();
- alert.show();
- }
- });
- //3.这个按钮时触发一个带多选按钮的AlertDialog
- btncheck.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- final String[] menu = new String[]{"水煮豆腐","萝卜牛腩","葱爆瘦肉"};
- //定义一个用来记录个列表项状态的boolean数组
- checkItems = new boolean[]{false,false,false};
- builder = new AlertDialog.Builder(MainActivity.this);
- builder.setIcon(R.drawable.huoyibu);
- builder.setTitle("点选你喜欢的菜肴:");
- builder.setMultiChoiceItems(menu, checkItems, new OnMultiChoiceClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which, boolean isChecked) {
- // TODO Auto-generated method stub
- checkItems[which] = isChecked;
- }
- });
- //为对话框添加确定按钮:
- builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- String result = "";
- for(int i = 0;i < checkItems.length;i++)
- {
- if(checkItems[i])
- result += menu[i]+" ";
- }
- Toast.makeText(getApplicationContext(),"客官你点了:"+result, Toast.LENGTH_SHORT).show();
- }
- });
- builder.create().show();
- }
- });
- }
- }
- </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:
- <span style="font-family:Comic Sans MS;"><?xml version="1.0" encoding="utf-8"?>
- <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <TableRow>
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="账号:"
- android:textSize="15sp"
- />
- <EditText
- android:id="@+id/txtname"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:hint="请输入您的账号: "
- android:selectAllOnFocus="true"
- />
- </TableRow>
- <TableRow>
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="密码:"
- android:textSize="12sp"
- />
- <EditText
- android:id="@+id/txtpassword"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:hint="请输入您的密码: "
- android:password="true"
- />
- </TableRow>
- </TableLayout></span>
解释:这些属性在前面的组件都有的,不会的可以查看前面的博文
接着,就是MainActivity.java,其实自定义和普通的区别就是用了setView方法,我们只需要为login布局创建一个view即可
这里的话用到inflate动态加载布局
代码如下:
- <span style="font-family:Comic Sans MS;">public class MainActivity extends Activity {
- private Button btnshow;
- private AlertDialog.Builder build = null;
- private EditText edit;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- btnshow = (Button) findViewById(R.id.btnshow);
- btnshow.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- TableLayout table = (TableLayout) getLayoutInflater().inflate(R.layout.login, null);
- edit = (EditText) table.findViewById(R.id.txtname);
- build = new AlertDialog.Builder(MainActivity.this);
- build.setIcon(R.drawable.pipi);
- build.setTitle("登陆界面:");
- build.setView(table);
- build.setPositiveButton("登陆", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Toast.makeText(getApplicationContext(), "欢迎你"+edit.getText(), Toast.LENGTH_SHORT).show();
- }
- });
- build.setNegativeButton("取消", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Toast.makeText(getApplicationContext(), "感谢您的使用!", Toast.LENGTH_SHORT).show();
- }
- });
- build.create().show();
- }
- });
- }
- }
- </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
- android-UI组件实例大全(十四)------对话框的父类:AlertDialog
- android-UI组件实例大全(十五)------其他对话框:ProgressDialog,Date/TimePickerDialog
- android UI 组件-对话框
- android UI 对话框大全
- 【Android】Android中AlertDialog对话框的使用实例
- AlertDialog对话框的开发实例
- Android中UI组件AlertDialog的各种实现
- Android UI学习 - 对话框 (AlertDialog & ProgressDialog)
- Android UI学习 - 对话框 (AlertDialog & ProgressDialog)
- Android UI学习 - 对话框 (AlertDialog & ProgressDialog)
- Android UI学习 - 对话框 (AlertDialog & ProgressDialog)
- Android UI学习 - 对话框 (AlertDialog & ProgressDialog)
- Android UI学习 - 对话框 (AlertDialog & ProgressDialog)
- Android UI学习 - 对话框 (AlertDialog & ProgressDialog)
- Android UI学习 - 对话框 (AlertDialog & ProgressDialog)
- android UI组件大全
- Android 对话框AlertDialog,PopupWindow使用大全
- android-UI组件实例大全(一)------TextView文本框
- 关于Myeclipse中添加onsubmit(return *)提示错误无返回值解决办法
- 魔法水晶
- 两点之间划线【交流贴】
- FFMPEG解码流程
- 开源还是商用?十大云运维监控工具横评
- android-UI组件实例大全(十四)------对话框的父类:AlertDialog
- SoapUI———mock数据工具
- 由于CRS磁盘dismount造成的CRS进程无法启动问题
- Could not open JPA EntityManager for transaction; nested exception is javax.pers
- android-UI组件实例大全(十五)------其他对话框:ProgressDialog,Date/TimePickerDialog
- 5.mysql 连接字符串为空时的处理
- 关于下拉框选择
- 栅栏的木料(二分+dfs)
- 请听一个故事------>一次皆大欢喜的程序员跳槽加薪