Android 中,对话框有以下五种:

+ Dialog

+ AlertDialog

+ CharacterPickerDialog

+ DatePickerDialog

+ ProgressDialog

其中 Dialog 是所有对话框的基类。 AlertDialog CharacterPickerDialog Dialog 的直接派生类, DatePickerDialog ProgressDialog TimePickerDialog Dialog 的间接派生类。 CharacterPickerDialog 的用处感觉不大,而且在 Android2.2 之前的版本似乎有 bug

下面文字中 对话框 的含义,包括 Dialog 自己及其所有的派生类。

+ 对话框必须在使用它的 Activity 中定义;

+ Activity 中有三个和对话框显示有关的方法,即 showDialog() dismissDialog() removeDialog() 。其中 showDialog() 方法用于显示一个对话框; dismissDialog() 使对话框消失,但仍然处于内存中,只是不显示而已,如果再次调用 showDialog() 方法,则缓存在内容的对话框,会重新显示,而不需要重新创建。 removeDialog() 使对话框消失,并从内存中将对话框清除,如果再次调用 showDialog() 方法来显示它,则在显示之前需要重新创建该对话框。相关函数的原型如下:

public final void showDialog (int id)

public final boolean showDialog (int id, Bundle args)

public final void dismissDialog (int id)

public final void removeDialog (int id)

其中第一个参数 id ,均为对话框所对应的 ID

+ Activity 中增加一个对话框的步骤大致如下:

- Activity 中为对话框定义唯一的标识符 (ID)

- 重写 Activity 中的 onCreateDialog() 方法,并返回一个对话框实例

- 重写 Activity 中的 onPrepareDialog() 方法。该方法不是必须重写的,但可以在该方法中为相关的对话框改变一些属性设置

- 调用 showDialog() 方法,显示该对话框

需要注意的是,在一个对话框的声明周期内, onCreateDialog() 仅被调用一次,但 onPrepareDialog() 方法可以被多次调用。比如,第一次调用 showDialog() 方法显示某个对话框时,会先触发 onCreateDialog() 方法的执行,然后再触发 onPrepareDialog() 方法的执行;如果将某个对话框 removeDialog() 后,再次用 showDialog() 显示它是,也会先触发 onCreateDialog() 方法的执行,然后再触发 onPrepareDialog() 方法的执行;如果某个对话框被 dismissDialog() 在屏幕上消失后,在调用 showDialog() 方法来显示它的话,则不会触发 onCreateDialog() 方法的执行,但会触发 onPrepareDialog() 方法的执行。正因为如此,可以在该方法中为相关的对话框 ( 同一个 ID) 改变一些属性设置。

+ Dialog 中也存在功能分别和 Activity 中的 showDialog() dismissDialog() 方法一样的方法,它们是 show() dismiss() ,其原型如下:

public void show ()

public void dismiss ()

但没有对应的 remove() 方法,理由很简单, removeDialog() 方法调用后,对话框实例已经不存在了,所以此时在对话框中的 remove 方法已经没有意义了。


1. 创建 Android Project ,修改其 main.xml ,使之如下:

<? xml version = "1.0" encoding = "utf-8" ?>

< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"

android:orientation = "vertical"

android:layout_width = "fill_parent"

android:layout_height = "fill_parent"

android:gravity = "center_horizontal"

>

< Button

android:id = "@+id/show_button1"

android:layout_width = "220px"

android:layout_height = "38px"

android:text = "Dialog (1)"

/>

< Button

android:id = "@+id/show_button2"

android:layout_width = "220px"

android:layout_height = "38px"

android:text = "AlertDialog (2)"

/>

< Button

android:id = "@+id/show_button3"

android:layout_width = "220px"

android:layout_height = "38px"

android:text = "AlertDialog (3)"

/>

< Button

android:id = "@+id/show_button4"

android:layout_width = "220px"

android:layout_height = "38px"

android:text = "AlertDialog (4)"

/>

< Button

android:id = "@+id/show_button5"

android:layout_width = "220px"

android:layout_height = "38px"

android:text = "AlertDialog (5)"

/>

< Button

android:id = "@+id/show_button6"

android:layout_width = "220px"

android:layout_height = "38px"

android:text = "AlertDialog (6)"

/>

< Button

android:id = "@+id/show_button7"

android:layout_width = "220px"

android:layout_height = "38px"

android:text = "CharacterPickerDialog (7)"

/>

< Button

android:id = "@+id/show_button8"

android:layout_width = "220px"

android:layout_height = "38px"

android:text = "DatePickerDialog (8)"

/>

< Button

android:id = "@+id/show_button9"

android:layout_width = "220px"

android:layout_height = "38px"

android:text = "TimePickerDialog (9)"

/>

< Button

android:id = "@+id/show_button10"

android:layout_width = "220px"

android:layout_height = "38px"

android:text = "ProgressDialog (10)"

/>

< Button

android:id = "@+id/show_button11"

android:layout_width = "220px"

android:layout_height = "38px"

android:text = "Customized Dialog (11)"

/>

</ LinearLayout >

2. 创建一个 layout 文件: custom_dialog.xml ,使其内容如下:

<? xml version = "1.0" encoding = "utf-8" ?>

< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"

android:layout_height = "wrap_content"

android:layout_width = "wrap_content"

android:background = "#ffffffff"

android:orientation = "horizontal"

android:gravity = "center_horizontal"

android:id = "@+id/dialog" >

< TextView

android:layout_height = "wrap_content"

android:layout_width = "wrap_content"

android:id = "@+id/tvname"

android:text = " 姓名 "

/>

< EditText

android:layout_height = "wrap_content"

android:layout_width = "wrap_content"

android:id = "@+id/etname"

android:minWidth = "140px"

/>

</ LinearLayout >

这个 layout 将用于自定义的对话框。

3. 修改 Activity 所对应的代码,使之如下:

package com.pnf.gui;

import android.app.Activity;

import android.app.AlertDialog;

import android.app.DatePickerDialog;

import android.app.Dialog;

import android.app.ProgressDialog;

import android.app.TimePickerDialog;

import android.content.DialogInterface;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.text.method.CharacterPickerDialog;

import android.util.Log;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.AdapterView;

import android.widget.Button;

import android.widget.DatePicker;

import android.widget.EditText;

import android.widget.TimePicker;

import android.widget.Toast;

public class ControlDialog extends Activity

implements

OnClickListener

{

// 声明一个 Dialog 对象

private Dialog dialog = null ;

// 声明 11 Button 对象 他们分别用于显示 11 个不同的对话框

private Button show_button1 ;

private Button show_button2 ;

private Button show_button3 ;

private Button show_button4 ;

private Button show_button5 ;

private Button show_button6 ;

private Button show_button7 ;

private Button show_button8 ;

private Button show_button9 ;

private Button show_button10 ;

private Button show_button11 ;

// 11 个不同的对话框设定 ID

private static final int ID_DIALOG1 = 1;

private static final int ID_DIALOG2 = 2;

private static final int ID_DIALOG3 = 3;

private static final int ID_DIALOG4 = 4;

private static final int ID_DIALOG5 = 5;

private static final int ID_DIALOG6 = 6;

private static final int ID_DIALOG7 = 7;

private static final int ID_DIALOG8 = 8;

private static final int ID_DIALOG9 = 9;

private static final int ID_DIALOG10 = 10;

private static final int ID_DIALOG11 = 11;

// 用于保存 ID ID_DIALOG5 的对话框的状态

private boolean id_dialog5 [] = { false , false };

// 用于保存 ID ID_DIALOG6 的对话框的状态

private int id_dialog6 = 0;

// 定义一个 Handler 对象 用于更新 ProgressDialog(ID ID_DIALOG10) 中的进度条

// 相关做法可以参考 AndroidGUI06 ProgressBar 常用技巧》

private Handler progressHandler = new Handler()

{

public void handleMessage(Message msg) // 重写 handleMessage 方法

{

((ProgressDialog) dialog ).setProgress(msg. what * 10);

if (msg. what == 1000) dismissDialog( ID_DIALOG10 );

}

};

public void onCreate(Bundle savedInstanceState)

{

super .onCreate(savedInstanceState);

setContentView(R.layout. main );

// 获取 11 按钮对象 并分别为他们设置 OnClickListener

show_button1 = (Button) this .findViewById(R.id. show_button1 );

show_button1 .setOnClickListener( this );

show_button2 = (Button) this .findViewById(R.id. show_button2 );

show_button2 .setOnClickListener( this );

show_button3 = (Button) this .findViewById(R.id. show_button3 );

show_button3 .setOnClickListener( this );

show_button4 = (Button) this .findViewById(R.id. show_button4 );

show_button4 .setOnClickListener( this );

show_button5 = (Button) this .findViewById(R.id. show_button5 );

show_button5 .setOnClickListener( this );

show_button6 = (Button) this .findViewById(R.id. show_button6 );

show_button6 .setOnClickListener( this );

show_button7 = (Button) this .findViewById(R.id. show_button7 );

show_button7 .setOnClickListener( this );

show_button8 = (Button) this .findViewById(R.id. show_button8 );

show_button8 .setOnClickListener( this );

show_button9 = (Button) this .findViewById(R.id. show_button9 );

show_button9 .setOnClickListener( this );

show_button10 = (Button) this .findViewById(R.id. show_button10 );

show_button10 .setOnClickListener( this );

show_button11 = (Button) this .findViewById(R.id. show_button11 );

show_button11 .setOnClickListener( this );

}

// OnClick 方法中 调用 showDialog(int id, Bundle args) 显示一个对话框时

// showDialog 的两个参数 会分别传递给 onCreateDialog

protected Dialog onCreateDialog( int id, Bundle args)

{

// 定义一个 AlertDialog.Builder 对象。创建 AlertDialog 时,都要用到这个

// AlertDialog.Builder 对象。自定义的对话框,本质上也是一个 AlertDialog

// 因此创建自定义对话框,也需要用到 AlertDialog.Builder

AlertDialog.Builder builder;

switch (id)

{

case ID_DIALOG1 : // 创建一个基本的对话框

dialog = new Dialog( this );

break ;

case ID_DIALOG2 : // 创建一个 AlertDialog 有两个按钮

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

builder.setTitle( "Prompt" );

builder.setMessage( "Are you sure to quit?" );

builder.setPositiveButton( "OK" , new DialogInterface.OnClickListener()

{

public void onClick(DialogInterface dialog, int which)

{

// which=-1 ( BUTTON_POSITIVE) 说明是 positive 按钮

// which=-2 ( BUTTON_NEGATIVE) 说明是 negative 按钮

Log.e ( "AlertDialog" , dialog.toString()+ " " + which);

// do something else

dialog.dismiss(); // 可以没有这句

}

});

builder.setNegativeButton( "Cancel" , new DialogInterface.OnClickListener()

{

public void onClick(DialogInterface dialog, int which)

{

// which=-1 ( BUTTON_POSITIVE) 说明是 positive 按钮

// which=-2 ( BUTTON_NEGATIVE) 说明是 negative 按钮

Log.e ( "AlertDialog" , dialog.toString()+ " " + which);

// do something else

dialog.dismiss(); // 可以没有这句

}

});

dialog = builder.create();

break ;

case ID_DIALOG3 : // 创建一个 AlertDialog 有三个按钮

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

builder.setIcon(android.R.drawable. btn_star );

builder.setTitle( "Survey of Favorite Star" );

builder.setMessage( "Do you like Jet Lee?" );

builder.setPositiveButton( "Great!" , new DialogInterface.OnClickListener()

{ // which=-1 ( BUTTON_POSITIVE) 说明是 positive 按钮

// which=-2 ( BUTTON_NEGATIVE) 说明是 negative 按钮

// which=-3 ( BUTTON_NEUTRAL) 说明是 neutral 按钮

public void onClick(DialogInterface dialog, int which)

{

Toast.makeText (ControlDialog. this , "I love him..." , Toast. LENGTH_LONG ).show();

dialog.dismiss(); // 可以没有这句

}

});

builder.setNegativeButton( "Hate!" , new DialogInterface.OnClickListener()

{ // which=-1 ( BUTTON_POSITIVE) 说明是 positive 按钮

// which=-2 ( BUTTON_NEGATIVE) 说明是 negative 按钮

// which=-3 ( BUTTON_NEUTRAL) 说明是 neutral 按钮

public void onClick(DialogInterface dialog, int which)

{

Toast.makeText (ControlDialog. this , "I hate him..." , Toast. LENGTH_LONG ).show();

dialog.dismiss(); // 可以没有这句

}

});

builder.setNeutralButton( "OK!" , new DialogInterface.OnClickListener()

{ // which=-1 ( BUTTON_POSITIVE) 说明是 positive 按钮

// which=-2 ( BUTTON_NEGATIVE) 说明是 negative 按钮

// which=-3 ( BUTTON_NEUTRAL) 说明是 neutral 按钮

public void onClick(DialogInterface dialog, int which)

{

Toast.makeText (ControlDialog. this , "Let me think..." , Toast. LENGTH_LONG ).show();

dialog.dismiss(); // 可以没有这句

}

});

dialog = builder.create();

break ;

case ID_DIALOG4 : // 创建一个 AlertDialog 有一个按钮和一个输入框

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

builder.setIcon(android.R.drawable. ic_dialog_info );

builder.setTitle( "Please input something" );

final EditText edit = new EditText( this );

builder.setView(edit);

builder.setPositiveButton( "OK" , new DialogInterface.OnClickListener()

{

public void onClick(DialogInterface dialog, int which)

{

Toast.makeText (ControlDialog. this , edit.getText().toString(), Toast. LENGTH_LONG ).show();

dialog.dismiss(); // 可以没有这句

}

});

dialog = builder.create();

break ;

case ID_DIALOG5 : // 创建一个 AlertDialog 有一个按钮和两个 CheckBox

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

builder.setIcon(android.R.drawable. ic_dialog_info );

builder.setTitle( "CheckBox in AlertDialog" );

builder.setMultiChoiceItems( new String[]{ "Item1" , "Item2" },

id_dialog5 , // id_dialog5 数组记录 CheckBox 的状态

new DialogInterface.OnMultiChoiceClickListener()

{

public void onClick(DialogInterface dialog, int which, boolean isChecked)

{

switch (which)

{

case 0:

if (isChecked) id_dialog5 [0] = true ;

else id_dialog5 [0] = false ;

break ;

case 1:

if (isChecked) id_dialog5 [1] = true ;

else id_dialog5 [1] = false ;

break ;

}

}

});

builder.setPositiveButton( "OK" , new DialogInterface.OnClickListener()

{

public void onClick(DialogInterface dialog, int which)

{

String tmpstr = "" ;

if ( id_dialog5 [0]) tmpstr = "Item1 is checked" ;

else tmpstr = "Item1 is not checked." ;

tmpstr += "/n" ;

if ( id_dialog5 [1]) tmpstr += "Item2 is checked" ;

else tmpstr += "Item2 is not checked." ;

Toast.makeText (ControlDialog. this , tmpstr, Toast. LENGTH_LONG ).show();

dialog.dismiss(); // 可以没有这句

}

});

dialog = builder.create();

break ;

case ID_DIALOG6 : // 创建一个 AlertDialog ,有一个按钮和两个 RadioButton

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

builder.setIcon(android.R.drawable. ic_dialog_info );

builder.setTitle( "RadioButton in AlertDialog" );

builder.setSingleChoiceItems( new String[]{ "Item1" , "Item2" },

id_dialog6 , // id_dialog6 记录那个 RadioButton 被选中

new DialogInterface.OnClickListener()

{

public void onClick(DialogInterface dialog, int which)

{

id_dialog6 = which;

}

});

builder.setPositiveButton( "OK" , new DialogInterface.OnClickListener()

{

public void onClick(DialogInterface dialog, int which)

{

String tmpstr = "" ;

if ( id_dialog6 == 0) tmpstr = "Item1 is selected" ;

else tmpstr = "Item2 is selected" ;

Toast.makeText (ControlDialog. this , tmpstr, Toast. LENGTH_LONG ).show();

dialog.dismiss(); // 可以没有这句

}

});

dialog = builder.create();

break ;

case ID_DIALOG7 : // 创建一个 CharacterPickerDialog

dialog = new CharacterPickerDialog( this , new View( this ), null , "0123" , false )

{

/* if we don't override these, pressing one of the buttons crashes */

@Override

public void onItemClick(AdapterView parent,

View view,

int position, long id)

{

Log.e ( "1" , "" + position + "/" + id);

}

@Override

public void onClick(View v)

{

Log.e ( "2" , ((Button)v).getText().toString());

dismiss();

}

};

break ;

case ID_DIALOG8 : // 创建一个 DatePickerDialog

dialog = new DatePickerDialog( this , new DatePickerDialog.OnDateSetListener()

{

public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)

{

String tmpstr = "" + year + "/" + (monthOfYear + 1) + "/" + dayOfMonth;

Toast.makeText (ControlDialog. this , tmpstr, Toast. LENGTH_SHORT ).show();

}

}, 2011,0, 1); // 注意:月份取值空间: 0~11

break ;

case ID_DIALOG9 : // 创建一个 TimePickerDialog

dialog = new TimePickerDialog( this , new TimePickerDialog.OnTimeSetListener()

{

public void onTimeSet(TimePicker view, int hourOfDay, int minute)

{

Toast.makeText (ControlDialog. this ,

"You picked " +hourOfDay+ " hours and " +minute+ " minutes." ,

Toast. LENGTH_SHORT ).show();

}

}, 0, 0, true );

break ;

case ID_DIALOG10 : // 创建一个 ProgressDialog

dialog = (ProgressDialog) new ProgressDialog(ControlDialog. this );

((ProgressDialog) dialog ).setIndeterminate( false );

((ProgressDialog) dialog ).setMax(10000);

((ProgressDialog) dialog ).setProgressStyle(ProgressDialog. STYLE_HORIZONTAL );

((ProgressDialog) dialog ).setTitle( " 显示进度 " );

((ProgressDialog) dialog ).setMessage( " 我们一直在进步 " );

break ;

case ID_DIALOG11 : // 创建一个自定义的对话框

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

LayoutInflater inflater = getLayoutInflater();

final View layout = inflater.inflate(R.layout. custom_dialog , null );

builder.setTitle( " 自定义对话框 " );

builder.setView(layout);

builder.setPositiveButton( " 确定 " , new DialogInterface.OnClickListener()

{

public void onClick(DialogInterface dialog, int which)

{

EditText ed = (EditText)layout.findViewById(R.id. etname );

Toast.makeText (ControlDialog. this , ed.getText().toString(), Toast. LENGTH_LONG ).show();

dialog.dismiss(); // 可以没有这句

}

});

dialog = builder.create();

break ;

}

// 返回创建的对话框实例

return dialog ;

}

// 在显示之前 对部分对话框的属性进行修改。

// 但, CharacterPickerDialog 的属性修改似乎无效 有人认为这是 CharacterPickerDialog 本身的 bug

protected void onPrepareDialog( int id, Dialog dialog)

{

switch (id)

{

case ID_DIALOG1 :

dialog.setTitle( "A dialog with title1" );

break ;

case ID_DIALOG2 :

((AlertDialog)dialog).setTitle( "Title" );

((AlertDialog)dialog).setMessage( "Simple Information" );

break ;

case ID_DIALOG8 :

((DatePickerDialog)dialog).setTitle( " 选择日期 " );

break ;

case ID_DIALOG9 :

((TimePickerDialog)dialog).setTitle( " 选择时间 " );

break ;

}

}

public void onClick(View v)

{

// 点击不同的按钮,显示不同的对话框

switch (v.getId())

{

case R.id. show_button1 :

this .showDialog( ID_DIALOG1 , null );

break ;

case R.id. show_button2 :

this .showDialog( ID_DIALOG2 , null );

break ;

case R.id. show_button3 :

this .showDialog( ID_DIALOG3 , null );

break ;

case R.id. show_button4 :

this .showDialog( ID_DIALOG4 , null );

break ;

case R.id. show_button5 :

this .showDialog( ID_DIALOG5 , null );

break ;

case R.id. show_button6 :

this .showDialog( ID_DIALOG6 , null );

break ;

case R.id. show_button7 :

this .showDialog( ID_DIALOG7 , null );

break ;

case R.id. show_button8 :

this .showDialog( ID_DIALOG8 , null );

break ;

case R.id. show_button9 :

this .showDialog( ID_DIALOG9 , null );

break ;

case R.id. show_button10 :

// 显示 ProgressDialog

this .showDialog( ID_DIALOG10 , null );

// 创建线程 pt

ProgressThread pt = new ProgressThread( progressHandler );

// 启动线程

pt.start();

break ;

case R.id. show_button11 :

this .showDialog( ID_DIALOG11 , null );

break ;

}

}

}

// 线程类:用于更新 ProgressDialog 中的进度条

class ProgressThread extends Thread

{

private Handler handler ;

public ProgressThread(Handler handler) // 传入一个 Handler 对象

{

this . handler = handler;

}

@Override

public void run()

{

int i = 0;

while (i <= 1000)

{

handler .sendEmptyMessage(i); // i 就是 Message what 的值 handler.sendEmptyMessage

// 会触发 handler handleMessage 执行

++i;

try

{

sleep (100); // 休息 100ms

}

catch (InterruptedException e)

{

e.printStackTrace();

}

}

}

}

4. 运行结果:


点击第一个按钮:


点击第二个按钮:

试着点击 OK 或者 Cancel 按钮,看看 LogCat 中有什么输出。

点击第三个按钮:


点击对话框上的三个按钮,会有对应的 Toast 出现。

点击第四个按钮:


EditText 中输入“ hello, android ”,在点击 OK 按钮,则会出现:


点击第五个按钮:

点击 Item1 ,然后点击 OK ,会出现:


点击第六个按钮:


选中 Item2 ,在点击 OK 按钮,会出现:


点击第七个按钮:


点击“ 0 ”按钮,观察在 LogCat 中输出。

点击第八个按钮:


将月份调整到 5 ,日期调整到 23 后,点击“设置”按钮,则会出现:


点击第九个按钮:


选择不同的时间,然后点击“设置”按钮,观察输出结果。

点击第十个按钮:


当进度达到 100% 的时候,对话框会自动消失。

点击第十一个按钮:


EditText 中输入一些文字,点击“确定”按钮,观察输出结果。

更多相关文章

  1. DataBinding 填坑总结
  2. Android部分手机拍照上传返回为空处理
  3. 基于ARouter的组件化开发
  4. Android(安卓)AlertDialog对话框详解及实例
  5. Android(安卓)存储路径
  6. [android]如何使LinearLayout布局从右向左水平排列,而不是从左向
  7. Android(安卓)系统原生dialog使用
  8. 【Android(安卓)开发教程】保存状态等信息
  9. Android(安卓)4.4以上使用HttpURLConnection底层使用OkHttp实现

随机推荐

  1. 让自己的应用具有被调出分享功能
  2. Notifications的使用建议
  3. Android(安卓)内存优化
  4. Head Fisrt Android(安卓)Development读
  5. LocationManager定位
  6. 回收图片
  7. android 常用权限备份
  8. Caching Bitmaps
  9. hcidump用法
  10. Android(安卓)TV -1.1- Get Started with