AlertDialog的用法
Posted sq19920518
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AlertDialog的用法相关的知识,希望对你有一定的参考价值。
一、AlertDialog的介绍
一个对话框一般是一个出现在当前Activity之上的一个小窗口,处于下面的Activity失去焦点, 对话框接受所有的用户交互,对话框一般用于提示信息和与当前应用程序直接相关的小功能。
Activities提供了一种方便管理的创建、保存、回复的对话框机制,例如 onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog(int), dismissDialog(int)等方法,如果使用这些方法的话,Activity将通过getOwnerActivity()方法返回该Activity管理的对话框(dialog).
onCreateDialog(int):当你使用这个回调函数时,android系统会有效的设置这个Activity为每个对话框的所有者,从而自动管理每个对话框的状态并挂靠到Activity上。这样,每个对话框继承这个Activity的特定属性。比如,当一个对话框打开时,菜单键显示为这个Activity定义的选项菜单,音量键修改Activity使用的音频流。
showDialog(int): 当你想要显示一个对话框时,调用showDialog(int id) 方法并传递一个唯一标识这个对话框的整数。当对话框第一次被请求时,Android从你的Activity中调用onCreateDialog(int id),你应该在这里初始化这个对话框Dialog。这个回调方法被传以和showDialog(int id)相同的ID。当你创建这个对话框后,在Activity的最后返回这个对象。
onPrepareDialog(int, Dialog):在对话框被显示之前,Android还调用了可选的回调函数onPrepareDialog(int id, Dialog). 如果你想在每一次对话框被打开时改变它的任何属性,你可以定义这个方法。这个方法在每次打开对话框时被调用,而onCreateDialog(int) 仅在对话框第一次打开时被调用。如果你不定义onPrepareDialog(),那么这个对话框将保持和上次打开时一样。这个方法也被传递以对话框的ID,和在onCreateDialog()中创建的对话框对象。
dismissDialog(int):当你准备关闭对话框时,你可以通过对这个对话框调用dismiss()来消除它。如果需要,你还可以从这个Activity中调用dismissDialog(int id) 方法,这实际上将为你对这个对话框调用dismiss() 方法。 如果你想使用onCreateDialog(int id) 方法来管理你对话框的状态(就如同在前面的章节讨论的那样),然后每次你的对话框消除的时候,这个对话框对象的状态将由该Activity保留。如果你决定不再需要这个对象或者清除该状态是重要的,那么你应该调用removeDialog(int id)。这将删除任何内部对象引用而且如果这个对话框正在显示,它将被消除。
二、AlertDialog对话框的创建
AlertDialog对话框主要包括:普通对话框、列表对话框、单选对话框和多选对话框。
代码如下:
package com.danny_jiang.day10_dialog;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnMultiChoiceClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
/**
* 普通对话框、列表对话框、单选对话框、多选对话框
* @author Administrator
*
*/
public class MainActivity extends Activity
private int position = -1;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* 所有的AlertDialog统统都是通过Builder去构建的
*/
public void click(View view)
switch (view.getId())
case R.id.alertDialog:
// 初始化Builder对象
AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
// 通过Builder设置对话框的title标题和message内容、以及图标
builder1.setTitle("残忍卸载");
builder1.setMessage("真的要卸载吗 T_T");
builder1.setIcon(R.drawable.ic_launcher);
// 设置为false说明当前dialog是不能用返回键取消的(默认为true)
builder1.setCancelable(false);
// 设置"坚持卸载"按钮
builder1.setPositiveButton("坚持卸载", new OnClickListener()
/**
* 当点击对话框中某一item时,此方法被调用
*
* @param which 是系统中确认按钮所对应的位置
*/
@Override
public void onClick(DialogInterface dialog, int which)
Toast.makeText(MainActivity.this, "点击了卸载按钮 which is" + which,
Toast.LENGTH_SHORT).show();
);
// 设置"取消卸载"按钮
builder1.setNegativeButton("取消卸载", new OnClickListener()
//此时的which是取消按钮的位置,由系统决定
@Override
public void onClick(DialogInterface dialog, int which)
Toast.makeText(MainActivity.this, "点击了取消按钮 + which is " + which,
Toast.LENGTH_SHORT).show();
);
// 设置"查看详情"按钮
builder1.setNeutralButton("查看详情", new OnClickListener()
//此时的which是查看详情的位置,由系统决定
@Override
public void onClick(DialogInterface dialog, int which)
Toast.makeText(MainActivity.this, "点击了查看详情+ which is " + which,
Toast.LENGTH_SHORT).show();
);
// 通过Builder.show方法显示对话框
builder1.show();
//AlertDialog dialog = builder1.create();
//dialog.show();
break;
case R.id.listDialog:
Builder builder2 = new Builder(this);
builder2.setTitle("作诗一首");
final String[] arr = getResources().getStringArray(R.array.poet);
//通过setItems设置为列表对话框样式
builder2.setItems(arr, new OnClickListener()
//此参数中的which是显示列表的item位置信息,从0开始
@Override
public void onClick(DialogInterface dialog, int which)
Toast.makeText(MainActivity.this, "您喜欢 " + arr[which],
Toast.LENGTH_SHORT).show();
);
builder2.show();
break;
case R.id.singleDialog:
Builder builder3 = new Builder(this);
builder3.setTitle("作诗一首");
final String[] arr2 = getResources().getStringArray(R.array.arr);
/**
* 通过Builder.setSingleChoiceItems方法设置单选对话框样式
* 1参数 所需要显示的列表内容
* 2参数 默认选中item的位置,从0开始。如果设置为-1,则无选中项
* 3参数 item选中的监听器
*/
builder3.setSingleChoiceItems(arr2, -1, new OnClickListener()
@Override
public void onClick(DialogInterface dialog, int which)
position = which;
);
builder3.setNegativeButton("Cancel", null);
builder3.setPositiveButton("OK", new OnClickListener()
@Override
public void onClick(DialogInterface dialog, int which)
String content = arr2[position];
Toast.makeText(MainActivity.this, "点击了 " + content,
Toast.LENGTH_SHORT).show();
);
builder3.show();
break;
case R.id.multiDialog:
Builder builder4 = new Builder(this);
builder4.setTitle("选中的兴趣爱好");
final String[] arr3 = getResources().getStringArray(R.array.arr2);
//创建boolean数组,长度跟字符串长度一致,保存有哪些item处于选中状态
final boolean[] checkedPos = new boolean[arr3.length];
final StringBuilder sBuilder = new StringBuilder();
builder4.setMultiChoiceItems(arr3, null, new OnMultiChoiceClickListener()
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked)
android.util.Log.e("danny", "which is " + which +
"isChecked is " + isChecked);
checkedPos[which] = isChecked;
);
builder4.setPositiveButton("OK", new OnClickListener()
@Override
public void onClick(DialogInterface dialog, int which)
for(int i = 0; i < checkedPos.length; i++)
if(checkedPos[i])
sBuilder.append(arr3[i] + "\\n");
String content = sBuilder.toString();
Toast.makeText(MainActivity.this, content, 1000).show();
);
builder4.show();
break;
default:
break;
布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="$relativePackage.$activityClass" >
<Button
android:id="@+id/alertDialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="click"
android:text="普通对话框" />
<Button
android:id="@+id/listDialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="click"
android:text="列表对话框" />
<Button
android:id="@+id/singleDialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="click"
android:text="单选对话框" />
<Button
android:id="@+id/multiDialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="click"
android:text="多选对话框" />
</LinearLayout>
strings.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Day10_Dialog</string>
<string name="hello_world">Hello world!</string>
<string-array name="poet">
<item>床前明月光</item>
<item>我爸是李刚</item>
<item>不识庐山真面目</item>
<item>只识弯弓射大雕</item>
</string-array>
<string-array name="arr">
<item>十年生死两茫茫</item>
<item>一树梨花压海棠</item>
<item>天苍苍,野茫茫</item>
<item>一树梨花压海棠</item>
</string-array>
<string-array name="arr2">
<item>在天愿做比翼鸟</item>
<item>大难临头各自飞</item>
<item>老夫疗法少年狂</item>
<item>青春作伴好还乡</item>
</string-array>
</resources>
效果图如下:
普通对话框
列表对话框
单选对话框
多选对话框
三、自定义View的AlertDialog
有时候系统自带的AlertDialog风格不能满足我们的需求,就比如说我们要实现一个Login画面,有用户名和密码,这时我们就要用到自定义View的AlertDialog
1、先创建自定义登录框的布局文件my_login_view.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="5dp" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="账号:" />
<EditText
android:id="@+id/account"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="5dp" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="密码:" />
<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="numberPassword" />
</LinearLayout>
</LinearLayout>
2、在Activity的合适地方创建自定义的AlertDialog(比如按钮的点击事件中):
package com.vince.login_dialog;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
public void click(View view)
AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater inflater = LayoutInflater.from(this);
final View myLoginView = inflater.inflate(R.layout.login_layout, null);
builder.setView(myLoginView);
builder.setTitle("用户登录");
builder.setPositiveButton("确定", new OnClickListener()
@Override
public void onClick(DialogInterface dialog, int which)
EditText account = (EditText) myLoginView
.findViewById(R.id.account);
EditText password = (EditText) myLoginView
.findViewById(R.id.password);
String acc = account.getText().toString();
String pass = password.getText().toString();
Toast.makeText(MainActivity.this, "账号:" + acc + " 密码:" + pass,
Toast.LENGTH_LONG).show();
);
builder.setNegativeButton("取消", new OnClickListener()
@Override
public void onClick(DialogInterface dialog, int which)
);
builder.show();
效果图如下:
四、自定义Adapter的AlertDialog
代码如下:
package com.vince.dialog_adapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class MainActivity extends Activity
// 数据源
private List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
private SimpleAdapter adapter;
private AlertDialog dialog;// 对话框
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化适配器
initAdapter();
/**
* 初始化适配器
*/
private void initAdapter()
for (int i = 0; i < 10; i++)
Map<String,Object> map=new HashMap<String, Object>();
map.put("name", "Android-"+i);
map.put("count", i);
list.add(map);
adapter = new SimpleAdapter(this, list,android.R.layout.simple_list_item_2,
new String[]"name","count",
new int[]android.R.id.text1,android.R.id.text2);
public void click(View view)
AlertDialog.Builder builder = new AlertDialog.Builder(this);
dialog = builder.setTitle("自定义适配器").setIcon(R.drawable.ic_launcher)
.setAdapter(adapter, new OnClickListener()
public void onClick(DialogInterface dialog, int which)
Toast.makeText(MainActivity.this,
"选中了" + list.get(which).get("name"),
Toast.LENGTH_LONG).show();
).create();
dialog.show();
效果图如下:
更多有关AlertDialog的介绍,见http://blog.csdn.net/ameyume/article/details/6138488
http://www.cnblogs.com/jiayongji/p/5371996.html
以上是关于AlertDialog的用法的主要内容,如果未能解决你的问题,请参考以下文章