对话框是一个小型窗口,它提示用户进行决策或者输入额外的信息。对话框并不填满整个屏幕并且正常情况下用以模态事件,需要用户在继续操作之前采取相应的行动。
Dialog
类是所有对话框的基类,但你应该避免直接实例化这个类。相反,使用下面的子类之一:
AlertDialog
:
这类对话框可以显示一个标题,最多三个按钮,一列可选项的列表或者定制布局。DatePickerDialog
或TimePickerDialog
:
有预定义界面的一类对话框,允许用户选择一个日期或时间。
这些类定义了对话框的样式和结构,但是你应该使用DialogFragment
作为你的对话框的容器。DialogFragment
类提供了对话框创建和外观管理的所有的控制,而不是调用Dialog
对象的方法。
使用DialogFragment
类管理对话框确保它能正确地处理生命周期事件,例如当用户点击Back
按钮或者旋转屏幕等。DialogFragment
类也允许你以一个较大的用户界面中的嵌入组件的方式来重用对话框的用户界面,就像一个传统的Fragment
一样(当你想要对话框界面以不同的方式显示在大屏幕和小屏幕上时)。
下面一节描述如何将DialogFragment
和AlertDialog
对象一起使用。
注意:因为DialogFragment
类是在Android 3.0
(API 11
)才加入的,这个文档描述了如何使用支持库(Support Library
)提供的DialogFragment
类。通过将这个库添加到你的应用程序,你可以在Android 1.6
或更高版本的设备上使用DialogFragment
和多种其他的API
。如果你的应用程序支持的最小版本是API 11
或更高,那么你可以使用DialogFragment
的框架版本。当使用支持库时,确保你导入android.support.v4.app.DialogFragment
类而不是android.app.DialogFragment
。
创建一个Dialog Fragment
你可以通过拓展DialogFragment
并在onCreateDialog()
回调函数中创建一个AlertDialog
的方式实现多种类型的对话框设计,包括定制布局和那些在对话框设计指导中描述的那些布局。
例如,下面是一个基本的AlertDialog
,由一个包含它的DialogFragment
管理。
public class FireMissilesDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the Builder class for convenient dialog construction
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(R.string.dialog_fire_missiles)
.setPositiveButton(R.string.fire, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// FIRE ZE MISSILES!
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User cancelled the dialog
}
});
// Create the AlertDialog object and return it
return builder.create();
}
}
现在,当你创建这个类的实例,并调用该对象的show()方法,则弹出对话框出现如图所示。
取决于你的对话框的复杂性,你可以实现多种其他的在DialogFragment
中的回调方法,包括所有的基本Fragment
的 生命周期方法。
构建一个Alert对话框
AlertDialog
类允许你实现各种各样的对话框设计,并且通常是你需要的唯一一个对话框类,如下图所示,一个Alert
对话框包括3个区域:
1. 标题
这是可选的,并且应该使用只有当内容区被详细的消息、列表或自定义布局占用时。如果你需要显示一个简单的消息或问题,你不需要标题。
2. 内容区
这里可以显示一个消息,一个列表或者其他的自定义布局。
3. 动作按钮
一个对话框中应该有不超过3个动作按钮。
AlertDialog.Builder
类提供了允许你使用这些类型的内容包括自定义的布局创建一个Alert
对话框的接口。
为了构建一个AlertDialog
,有以下几步:
//1. 利用AlertDialog.Builder构造器实例化一个builder
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
//2.将多个setter方法链接起来设置对话框特性
builder.setMessage(R.string.dialog_message).setTitle(R.string.dialog_title);
//3.从create()方法中获得AlertDialog
AlertDialog dialog = builder.create();
添加按钮
为了添加如图中的按钮,调用setPositiveButton()
和setNegativeButton()方
法:
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity);
builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int id){
//用户点击OK按钮
}
});
builder.setNegativeButton(R.string.cancel,new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int id){
//用户点击取消按钮
}
});
//设置其他的对话框属性
//创建AlertDialog
AlertDialog dialog = builder.create();
set...Button()
方法需要为按钮指定一个标题(通过资源字符串提供)和一个DialogInterface.OnClickListener
定义当用户点击按钮时采取的行为。
有三类不同的动作按钮可以添加:
Positive
你应该使用这个按钮来接受或继续这个动作(OK动作)Negative
你应该使用这个按钮来取消动作Neutral
你应该在当用户可能不想要继续这个动作,但也没必要取消的情况下使用这个按钮。它出现在Positive
和Negative
按钮之间。例如,这个动作可能是“晚点提醒我”等。
你只能为每一类按钮添加一个到Alert
对话框中。也就是说,你不能有多于一个的Positive
按钮。
添加一个自定义布局
如果你想要在对话框中使用自定义布局,你需要创建一个布局文件并通过调用AlertDialog.Builder
对象的setView()
添加到AlertDialog
中。
默认情况下,自定义布局填满对话框窗口,但是你仍然可以使用AlertDialog.Builder
方法来添加按钮或标题。
例如,下面是一个对话框的布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:src="@drawable/header_logo"
android:layout_width="match_parent"
android:layout_height="64dp"
android:scaleType="center"
android:background="#FFFFBB33"
android:contentDescription="@string/app_name" />
<EditText
android:id="@+id/username"
android:inputType="textEmailAddress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:layout_marginBottom="4dp"
android:hint="@string/username" />
<EditText
android:id="@+id/password"
android:inputType="textPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:layout_marginBottom="16dp"
android:fontFamily="sans-serif"
android:hint="@string/password"/>
</LinearLayout>
小技巧:默认情况下,当你使用textPassword
输入类型设置一个EditText
元素时,字体被设置为monospace
。这样你应该改变它的字体为sans-serif
,这样所有的文本域都使用一个匹配的字体样式。
为了在你的DialogFragment
中填充布局,使用getLayoutInflater()
获得一个LayoutInflater
并调用inflate()
方法。在这个方法中,第一个参数是布局资源ID
,第二个参数是为布局文件定义的父视图。然后,你可以调用setView()
方法来在这个对话框中放置布局文件。
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// Get the layout inflater
LayoutInflater inflater = getActivity().getLayoutInflater();
// Inflate and set the layout for the dialog
// Pass null as the parent view because its going in the dialog layout
builder.setView(inflater.inflate(R.layout.dialog_signin, null))
// Add action buttons
.setPositiveButton(R.string.signin, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
// sign in the user ...
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
LoginDialogFragment.this.getDialog().cancel();
}
});
return builder.create();
小技巧:如果你想要创建自定义对话框,你也可以显示一个Activity
作为一个对话框而不是使用Dialog
。简单地创建一个活动并在清单文件的<activity>
元素下设置它的主题为Theme.Holo.Dialog
。
<activity android:theme="@android:style/Theme.Holo.Dialog">
搞定。活动现在显示为一个对话框窗口而不是全屏的。
显示对话框
当你想要显示你的对话框时,创建你的DialogFragment
类的实例并调用show()
方法,传入FragmentManager
参数和为这个dialog frament
指定的标签名称。
你可以通过调用FragmentActivity
的getSupportFragmentManager()
方法,或者Fragment
的getFragmentManager()
方法获得FragmentManager
。例如:
public void confirmFireMissiles() {
DialogFragment newFragment = new FireMissilesDialogFragment();
newFragment.show(getSupportFragmentManager(), "missiles");
}
第二个参数,"missiles"
是一个独一无二的标签名,系统用它来保存或恢复Fragment
状态。这个标注允许你通过调用findFragmentByTag()
方法获得一个Fragment
的句柄。
解除对话框
当用户触碰任何一个使用AlertDialog.Builder
创建的动作按钮,系统为你解除对话框。
当用户触碰对话框列表中的一项时,系统也会解除对话框,除非当列表使用radio
按钮或checkbox
。除此之外,你也可以通过调用DialogFragment
的dismiss()
方式手动地解除对话框。
在你需要在当对话框消息时执行特定的动作时,你可以实现DialogFragment
的onDismiss()
方法。
你也可以取消对话框。这是一个特殊的事件,说明用户明确离开对话框,没有完成任务。这发生在用户点击Back
按钮、触摸对话框区域外的屏幕区域或者明确地调用Dialog
的cancel
方法。
可以通过实现DialogFragment
类的onCancel()
方法来响应取消事件。
原文
http://wear.techbrood.com/guide/topics/ui/dialogs.html#DismissingADialog