`
taimukang
  • 浏览: 183959 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Android--对话框

阅读更多

创建对话框 Creating Dialogs

对话框通常是一个显示在当前活动前面的小窗口。下面的活动失去焦点而由对话框接受所有的用户交互。对话框通常被用来当做通知或者运行中的应用程序相关的短暂活动。

Android API 支持下面的对话框对象类型:

警告对话框 AlertDialog

这个对话框管理 0 1 2 ,或 3 个按钮,和 / 或一个可包含复选框和单选按钮的可选项列表。这个警告对话框能够组建大多数用户界面而且是推荐使用的对话框类型。请查看下面的创建一个警告对话框 Creating an AlertDialog

进度对话框 ProgressDialog

用来显示一个进度轮或进度条。因此它是警告对话框的扩展,它也支持按钮。请查看下面的 Creating a ProgressDialog

日期选择对话框 DatePickerDialog

一个允许用户选择日期的对话框。请查看 Hello DatePicker 指南。

时间选择对话框 TimePickerDialog

一个允许用户选择时间的对话框。请查看 Hello TimePicker 指南 .

如果你想定制你自己的对话框,你可以在基础对话框对象或任何上面列举的子类对话框上进行扩展并定义一个新的布局。请查看下面的创建自定义对话框 Creating a Custom Dialog 章节。

显示对话框 Showing a Dialog

对话框经常作为活动 Activity 的一部分来创建和显示。你通常应该从活动的 onCreateDialog(int) 回调方法里创建对话框。当你使用这个回调函数时, Android 系统会有效的设置这个活动为每个对话框的所有者,从而自动管理每个对话框的状态并挂靠到活动上。这样,每个对话框继承这个活动的特定属性。比如,当一个对话框打开时,菜单键显示为这个活动定义的选项菜单,音量键修改活动使用的音频流。

注意 : 如果你决定在 onCreateDialog() 方法之外创建一个对话框,它将不会被附着到活动上。不过,你可以通过 setOwnerActivity(Activity) 把它附着到一个活动上。

当你想要显示一个对话框时,调用 showDialog(int) 方法并传递一个唯一标识这个对话框的整数。

当对话框第一次被请求时, Android 从你的活动中调用 onCreateDialog(int) ,你应该在这里初始化这个对话框 Dialog 。这个回调方法被传以和 showDialog(int) 相同的 ID 。当你创建这个对话框后,在方法的最后返回这个对象。

在对话框被显示之前, Android 还调用了可选的回调函数 onPrepareDialog(int, Dialog) . 如果你想在每一次对话框被打开时改变它的任何属性,你可以定义这个方法。这个方法在每次打开对话框时被调用,而 onCreateDialog(int) 仅在对话框第一次打开时被调用。如果你不定义 onPrepareDialog() ,那么这个对话框将保持和上次打开时一样。这个方法也被传递以对话框的 ID ,和在 onCreateDialog() 中创建的对话框对象。

定义 onCreateDialog(int) onPrepareDialog(int, Dialog) 回调函数的最佳方法是使用一个 switch 语句来检查传递进来的 id 参数。每个 case 应该检查一个唯一的对话框 ID 然后创建和定义相应的对话框。比如,想象一下一个游戏使用两个不同的对话框:一个用来指示这个游戏已经暂停而另一个来指示游戏结束。首先,为每个对话框定义一个整数:

static final int DIALOG_PAUSED_ID = 0;

static final int DIALOG_GAMEOVER_ID = 1;

然后,为每一个 ID 用一个 switch case 定义这个 onCreateDialog(int) 回调函数:

protected Dialog onCreateDialog(int id) {

    Dialog dialog;

    switch(id) {

    case DIALOG_PAUSED_ID:

        // do the work to define the pause Dialog

        break;

    case DIALOG_GAMEOVER_ID:

        // do the work to define the game over Dialog

        break;

    default:

        dialog = null;

    }

    return dialog;

}

注意 : 在这个例子里, case 语句没有具体内容,因为这超出了本章讨论范围。

当是时候显示其中之一的对话框时,使用对话框 ID 调用 showDialog(int)

showDialog(DIALOG_PAUSED_ID);

消除对话框 Dismissing a Dialog

当你准备关闭对话框时,你可以通过对这个对话框调用 dismiss() 来消除它。如果需要,你还可以从这个活动中调用 dismissDialog(int) 方法,这实际上将为你对这个对话框调用 dismiss() 方法 .

如果你想使用 onCreateDialog(int) 方法来管理你对话框的状态(就如同在前面的章节讨论的那样),然后每次你的对话框消除的时候,这个对话框对象的状态将由该活动保留。如果你决定不再需要这个对象或者清除该状态是重要的,那么你应该调用 removeDialog(int) 。这将删除任何内部对象引用而且如果这个对话框正在显示,它将被消除。

使用消除侦听器 Using dismiss listeners

如果你希望你的应用程序在一个对话框消亡的时候执行一些流程,那么你应该附着一个 on-dismiss 侦听器到对话框上。

首先定义 DialogInterface.OnDismissListener 接口。这个接口只有一个方法, onDismiss(DialogInterface) ,将在对话框消亡的时候被调用。然后简单的传递你的 OnDismissListener 实现给 setOnDismissListener()

然而 , 请注意对话框也可以被 取消 。这是一个表明对话框被用户显示取消的特殊情况。这将在用户按 返回 按钮时发生,或者这个对话框显示的调用 cancel() (也许通过对话框上的一个 取消 按钮)。当一个对话框被取消时,这个 OnDismissListener 依然会被通知到,但是如果你希望在对话框被显示取消时被通知到(而不是通常的消除方式),那么你应该通过 setOnCancelListener() 注册一个 DialogInterface.OnCancelListener

创建警告对话框 Creating an AlertDialog

一个警告对话框是对话框的扩展类。它能够构建大多数对话框用户界面并且是推荐使用的对话框类型。你应该在具备如下特性的时候使用它:

·          一个标题

·           一个文本消息

·          1 个, 2 个或 3 个按钮

·           一个可选项列表(可选的复选框或单选按钮)

为了创建一个警告对话框,使用 AlertDialog.Builder 子类。通过 AlertDialog.Builder(Context) 获取一个构造器然后使用这个类的公共方法来定义警告对话框的所有属性。当得到构造器后,通过 create() . 方法来获取警告对话框对象。

下面的题目说明了如何使用 AlertDialog.Builder 类来定义不同的警告对话框属性。如果你在 onCreateDialog() 回调函数中使用下面的代码,你可以返回结果对话框对象来显示它。

增加按钮 Adding buttons

为了创建一个如右图所示的包含并行按钮的警告对话框,使用 set...Button() 方法:

 

AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setMessage("Are you sure you want to exit?")

       .setCancelable(false)

       .setPositiveButton("Yes", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int id) {

                MyActivity.this.finish();

           }

       })

       .setNegativeButton("No", new DialogInterface.OnClickListener() {

           public void onClick(DialogInterface dialog, int id) {

                dialog.cancel();

           }

       });

AlertDialog alert = builder.create();

首先,为这个对话框添加一个消息 setMessage(CharSequence) 。然后,开始函数链并设置该对话框为不能取消 not cancelable (因此用户不能使用返回按钮关闭这个对话框)。对每个按钮,使用任一 set...Button() 方法,比如 setPositiveButton() ,该方法接受按钮名称以及一个定义用户选中按钮后所采取动作的 DialogInterface.OnClickListener

注意 : 你仅可以为这个警告对话框添加其中一种按钮类型。也就是,你不能包含多个“确定”按钮。这限制了可能的按钮数目只能是 3 个:确定,中立和否定。这些名字和你按钮的实际功能是技术上无关的,但是应该可以帮助你记录做了什么。

增加一个列表 Adding a list

为了创建一个带有可选项列表的警告对话框,如右边所示,可使用 setItems() 方法:

 

final CharSequence[] items = {"Red", "Green", "Blue"};

 

AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("Pick a color");

builder.setItems(items, new DialogInterface.OnClickListener() {

    public void onClick(DialogInterface dialog, int item) {

        Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();

    }

});

AlertDialog alert = builder.create();

首先,用 setTitle(CharSequence) 方法给对话框添加一个标题。然后,添加用 setItems() 添加一个可选项列表,该列表接受一组显示的 items 和一个 DialogInterface.OnClickListener 来定义用户选中按钮后所采取动作。

增加复选框和单选按钮

要在对话框里创建一个多选项列表( checkboxes )或者单选项( radio buttons ),可分别调用 setMultiChoiceItems() setSingleChoiceItems() 方法。如果你在 onCreateDialog() 回调函数中创建这些可选列表, Android 会帮你管理列表状态。只要这个活动是激活的,对话框会记住之前选中的 items ,但如果用户退出这个活动,用户选择将丢失。

注意 : 为了在用户离开或暂停这个活动的时候能够保存选择,你必须通过活动生命期 Activity Lifecycle 来恰当的保存和恢复设置。为了永久保存选项,即使活动进程被完全终止,你需要使用数据存储 Data Storage 技术。

要创建如右边所示的一个包含单选项列表的警告对话框,使用前面例子中相同的代码,不过需要把 setItems() 方法替换为 setSingleChoiceItems()

 

final CharSequence[] items = {"Red", "Green", "Blue"};

 

AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("Pick a color");

builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {

    public void onClick(DialogInterface dialog, int item) {

         Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();

    }

});

AlertDialog alert = builder.create();

setSingleChoiceItems() 的第二个参数是一个 checkedItem 整型数值,指示了基于 0 的缺省选择项的位置。“ -1 ”代表不会有默认选择项。

创建进度对话框 Creating a ProgressDialog

进度对话框 ProgressDialog AlertDialog 类的一个扩展,可以为一个未定义进度的任务显示一个旋转轮形状的进度动画,或者为一个指定进度的任务显示一个进度条。这个对话框也能提供按钮,比如一个取消下载的按钮。

可以简单的通过调用 ProgressDialog.show() 方法来显示一个进度对话框。比如, 可以很简单的得到右边显示的进度对话框,而不必通过 onCreateDialog(int) 回调管理这个对话框,如下所示:

 

ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "",

                         "Loading. Please wait...", true);

第一个参数是应用程序上下文 Context ,第二个是对话框标题(此处为空),第三个是信息,最后这个参数表明进度是否是不确定的(这只和创建进度条有关,下一章会有描述)。

进度对话框的缺省类型是一个旋转轮,如果你想创建一个间隔进度,需要更多的代码,如下章所述。

显示进度条 Showing a progress bar

使用动画进度条显示进度:

1.       用类构造器初始化进度对话框, ProgressDialog(Context)

2.      setProgressStyle(int) 方法设置进度风格为 "STYLE_HORIZONTAL" 以及设置其它属性,比如消息。

3.    当你准备显示这个对话框时,调用 show() 或者从 onCreateDialog(int) 回调中返回 ProgressDialog

4.    你可以通过调用 setProgress(int) 设置当前进度百分比或者调用 incrementProgressBy(int) 方法增加进度值。

比如,你的设置可能看起来像这样:

ProgressDialog progressDialog;

progressDialog = new ProgressDialog(mContext);

progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

progressDialog.setMessage("Loading...");

progressDialog.setCancelable(false);

设置很简单。大多数创建代码也用来更新进度。你可能意识到创建另外一个线程来完成这个进度报告的工作是有必要的,进度通过一个对象返回给活动的用户界面线程。如果你对如何通过一个 Handler 使用另外的线程不熟悉,请参见下面的例子:

Example ProgressDialog with a second thread

这个例子使用了另外一个线程来跟踪进程进度(计数到 100 )。这个线程在每次进度更新时通过一个句柄 Handler 发回一条消息 Message 。主活动然后更新进度对话框。

package com.example.progressdialog;

 

import android.app.Activity;

import android.app.Dialog;

import android.app.ProgressDialog;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

 

public class NotificationTest extends Activity {

    static final int PROGRESS_DIALOG = 0;

    Button button;

    ProgressThread progressThread;

    ProgressDialog progressDialog;

  

    /** Called when the activity is first created. */

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

 

        // Setup the button that starts the progress dialog

        button = (Button) findViewById(R.id.progressDialog);

        button.setOnClickListener(new OnClickListener(){

            public void onClick(View v) {

                showDialog(PROGRESS_DIALOG);

            }

        });

    }

  

    protected Dialog onCreateDialog(int id) {

         switch(id) {

        case PROGRESS_DIALOG:

            progressDialog = new ProgressDialog(NotificationTest.this);

            progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

            progressDialog.setMessage("Loading...");

             progressThread = new ProgressThread(handler);

            progressThread.start();

            return progressDialog;

        default:

            return null;

        }

    }

 

    // Define the Handler that receives messages from the thread and update the progress

    final Handler handler = new Handler() {

        public void handleMessage(Message msg) {

            int total = msg.getData().getInt("total");

            progressDialog.setProgress(total);

            if (total >= 100){

                 dismissDialog(PROGRESS_DIALOG);

                progressThread.setState(ProgressThread.STATE_DONE);

            }

        }

    };

 

    /** Nested class that performs progress calculations (counting) */

    private class ProgressThread extends Thread {

        Handler mHandler;

        final static int STATE_DONE = 0;

        final static int STATE_RUNNING = 1;

        int mState;

        int total;

      

        ProgressThread(Handler h) {

            mHandler = h;

        }

      

        public void run() {

            mState = STATE_RUNNING;  

            total = 0;

            while (mState == STATE_RUNNING) {

                try {

                    Thread.sleep(100);

                } catch (InterruptedException e) {

                    Log.e("ERROR", "Thread Interrupted");

                }

                Message msg = mHandler.obtainMessage();

                Bundle b = new Bundle();

                b.putInt("total", total);

                msg.setData(b);<

分享到:
评论

相关推荐

    仿IOS圆角对话框 Android-CircleDialog.zip

    在Android开发中,为了提供与iOS相似的用户体验,开发者经常需要创建具有圆角设计的对话框。"Android-CircleDialog.zip" 包含了一个开源项目,名为 "Android-CircleDialog",它是一个专为实现iOS风格圆角对话框、...

    Android---UI篇

    •Android---UI篇---Dialog(对话框) • •Android---UI篇---AutoCompleteTextView(自动提示) • •Android---UI篇---Toast(提示) • •Android---UI篇---Button(按钮) • •Android---UI篇---TextView...

    android--- 对话框的使用

    在Android开发中,对话框(Dialog)是一种非常重要的组件,用于与用户进行交互,提供临时的通知或选项。对话框不会占用整个屏幕,而是浮现在应用界面之上,吸引用户的注意力。本教程将详细介绍如何在Android中创建和...

    Android-Dialog对话框

    在Android开发中,Dialog对话框是一种常见的用户交互组件,它用于在主界面之上显示一个临时窗口,用于提示信息、确认操作或提供选择项。本文将深入探讨`Android-Dialog`对话框的相关知识点,并结合源码分析,以帮助...

    android dialog------普通对话框

    在Android开发中,Dialog是一种非常常见的用户界面组件,它用于在主界面之上显示一个临时的、半透明的小窗口,用于提示用户或者获取用户的输入。在本文中,我们将深入探讨如何在Android应用中创建和使用普通的Dialog...

    Android-所有Dialog对话框(源码).zip

    Android-所有Dialog对话框(源码).zip Android-所有Dialog对话框(源码).zip Android-所有Dialog对话框(源码).zip

    android-support-v7.jar

    此外,`android.support.v7.app`包中的`AlertDialog`、`DatePickerDialog`和`TimePickerDialog`等对话框,以及`NotificationCompat`类,提供了对早期Android版本的通知兼容性,使得开发者可以创建与最新API级别设备...

    Android-DialogAlchemy对话框工具类解决屏幕旋转的问题

    在Android应用开发中,对话框(Dialog)是用户界面中不可或缺的部分,用于向用户展示临时信息或接收用户输入。然而,当设备发生屏幕旋转时,Android系统会默认销毁当前活动(Activity)并重新创建,这可能导致对话框...

    Android-实验课09-上下文菜单-对话框练习.rar

    在Android应用开发中,上下文菜单(Context Menu)和对话框(Dialog)是两种常见的用户交互界面元素,它们在提供用户操作选项和展示重要信息时起到关键作用。本实验课程旨在帮助开发者深入理解和熟练运用这两种功能。 *...

    Android程序源码--对话框

    总之,Android对话框的实现涉及多个层次的源码,从基础的Dialog类到各种特定类型的对话框,每个都提供了丰富的功能和定制选项。理解和掌握这些源码可以帮助开发者更好地利用对话框提升应用的用户体验。

    Android常用对话框源码对话框大全

    在Android开发中,对话框(Dialog)是一种非常重要的组件,用于与用户进行交互,提供临时的通知、确认或者选项。在"Android常用对话框源码--对话框大全"中,我们可以探讨多种类型的对话框及其实现方式。 1. **系统...

    Android---UI篇---Dialog(对话框)

    ### Android UI篇——Dialog(对话框) 在Android应用开发中,对话框(Dialog)作为用户交互的重要组成部分之一,被广泛应用于各种场景下,比如提示信息、请求确认操作、登录界面等。本文将深入探讨Android中Dialog的...

    安卓Android源码——android-styled-dialogs 可自定义样式的dialog.rar

    通过深入研究 `android-styled-dialogs` 的源码,你可以掌握自定义 Dialog 的技巧,并能够根据自己的需求创建出符合应用风格的对话框,提升应用的整体质感和用户体验。同时,这也是对 Android UI 开发能力的一次良好...

    Android 用户界面---对话框(Dialogs).docx

    在Android开发中,用户界面设计至关重要,而对话框(Dialogs)是用户交互中常见的组件,它们用于提供额外信息、确认用户操作或者展示进度等。在Android中,对话框分为多种类型,每种都有其特定的用途和实现方式。 ...

    Android 用户界面---对话框(Dialogs).pdf

    在Android开发中,用户界面设计是非常重要的一环,而对话框(Dialogs)是提升用户体验的重要组件。对话框通常用于向用户展示临时信息、获取输入或者进行特定操作,比如确认、警告、选择等。对话框分为多种类型,每种都...

    FancyAlertDialog-Android,让你的原生android对话框更漂亮。一个库,它将标准的android对话框提升到一个新的级别,并提供多种样式选项。从代码中设置对话框的样式。.zip

    `FancyAlertDialog-Android` 提供了丰富的样式选项,使得原本单调的标准Android对话框得以焕然一新。这个库不仅提供了预设的样式,还允许开发者通过代码动态设置对话框的样式,增强了灵活性和自定义程度。这意味着...

    Android代码-普通对话框源码.zip

    在Android开发中,对话框(Dialog)是一种常见的用户交互组件,用于向用户显示临时信息或者进行简单的用户操作选择。这个“普通对话框源码.zip”文件包含的就是关于Android普通对话框的实现源代码,这对于理解和...

    安卓Dialog对话框相关-android-styled-dialogs可自定义样式的dialog.zip

    android-styled-dialogs 可自定义样式的dialog.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

    Android-CircleDialog.zip

    列表框(ListView或RecyclerView)在Android对话框中的应用常见于多选项选择。在CircleDialog中,开发者可能利用Adapter和ViewHolder模式来填充和展示列表数据。为了保持对话框的圆角效果,列表项的布局也需要进行...

Global site tag (gtag.js) - Google Analytics