Android应用程序用户界面(十)对话框

本文深入探讨了对话框在Android应用中的设计与管理方法,包括如何创建不同类型的对话框,如AlertDialog、DatePickerDialog和TimePickerDialog,以及如何使用DialogFragment进行更灵活的管理。文章还介绍了如何添加自定义布局、按钮和处理生命周期事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对话框是一个小型窗口,它提示用户进行决策或者输入额外的信息。对话框并不填满整个屏幕并且正常情况下用以模态事件,需要用户在继续操作之前采取相应的行动。

Dialog类是所有对话框的基类,但你应该避免直接实例化这个类。相反,使用下面的子类之一:

  • AlertDialog:
    这类对话框可以显示一个标题,最多三个按钮,一列可选项的列表或者定制布局。
  • DatePickerDialogTimePickerDialog:
    有预定义界面的一类对话框,允许用户选择一个日期或时间。

这些类定义了对话框的样式和结构,但是你应该使用DialogFragment作为你的对话框的容器。DialogFragment类提供了对话框创建和外观管理的所有的控制,而不是调用Dialog对象的方法。

使用DialogFragment类管理对话框确保它能正确地处理生命周期事件,例如当用户点击Back按钮或者旋转屏幕等。DialogFragment类也允许你以一个较大的用户界面中的嵌入组件的方式来重用对话框的用户界面,就像一个传统的Fragment一样(当你想要对话框界面以不同的方式显示在大屏幕和小屏幕上时)。

下面一节描述如何将DialogFragmentAlertDialog对象一起使用。

注意:因为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个区域:
dialogs_region
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
    你应该在当用户可能不想要继续这个动作,但也没必要取消的情况下使用这个按钮。它出现在PositiveNegative按钮之间。例如,这个动作可能是“晚点提醒我”等。

你只能为每一类按钮添加一个到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指定的标签名称。

你可以通过调用FragmentActivitygetSupportFragmentManager()方法,或者FragmentgetFragmentManager()方法获得FragmentManager。例如:

public void confirmFireMissiles() {
    DialogFragment newFragment = new FireMissilesDialogFragment();
    newFragment.show(getSupportFragmentManager(), "missiles");
}

第二个参数,"missiles"是一个独一无二的标签名,系统用它来保存或恢复Fragment状态。这个标注允许你通过调用findFragmentByTag()方法获得一个Fragment的句柄。

解除对话框

当用户触碰任何一个使用AlertDialog.Builder创建的动作按钮,系统为你解除对话框。

当用户触碰对话框列表中的一项时,系统也会解除对话框,除非当列表使用radio按钮或checkbox。除此之外,你也可以通过调用DialogFragmentdismiss()方式手动地解除对话框。

在你需要在当对话框消息时执行特定的动作时,你可以实现DialogFragmentonDismiss()方法。

你也可以取消对话框。这是一个特殊的事件,说明用户明确离开对话框,没有完成任务。这发生在用户点击Back按钮、触摸对话框区域外的屏幕区域或者明确地调用Dialogcancel方法。

可以通过实现DialogFragment类的onCancel()方法来响应取消事件。

原文

http://wear.techbrood.com/guide/topics/ui/dialogs.html#DismissingADialog

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值