【起航计划 020】2015 起航计划 Android APIDemo的魔鬼步伐 19 App->Dialog Dialog样式

这个例子的主Activity定义在AlertDialogSamples.java 主要用来介绍类AlertDialog的用法,AlertDialog提供的功能是多样的:

  • 显示消息给用户,并可提供一到三个按钮(OK, Cancel ,Yes ,No)用于选择或是显示警告。
  • 显示一个列表以供用户选择,列表中可以是Radio Button  (单选),Check button (多选)
  • 显示文本框来接受用户输入等。

创建AlertDialog一般是通过AlertDialog.Builder来构造:

AlertDialog.Builder ad=new AlertDialog.Builder(context);

之后可以为这个AlergDialog设置标题,显示的信息,需要显示的Buttons等。然后调用 ad.show来显示这个对话框。

为了避免每次显示对话框都新建一个Dialog对象,Android提供两个方法 onCreateDialog和onPrepareDialog事件来管理对话框的创建。

通过重载onCreateDialog,可以根据需要(如执行showDialog时)创建所需对话框实例。而在创建这个对话框实例后,在每次 showDialog之前,如果需要对这个对话框做些修改可以重载onPrepareDialog方法来实现。 原理和Android管理Menu的方法类似。

下面给出使用AlertDialog的一般步骤。因为在onCreateDialog可能创建多个Dialog示例,所以必须先定义一个Dialog的ID。

    private static final int DIALOG_YES_NO_MESSAGE = 1;
    private static final int DIALOG_YES_NO_LONG_MESSAGE = 2;
    private static final int DIALOG_LIST = 3;
    private static final int DIALOG_PROGRESS = 4;
    private static final int DIALOG_SINGLE_CHOICE = 5;
    private static final int DIALOG_MULTIPLE_CHOICE = 6;
    private static final int DIALOG_TEXT_ENTRY = 7;
    private static final int DIALOG_MULTIPLE_CHOICE_CURSOR = 8;
    private static final int DIALOG_YES_NO_ULTRA_LONG_MESSAGE = 9;
    private static final int DIALOG_YES_NO_OLD_SCHOOL_MESSAGE = 10;
    private static final int DIALOG_YES_NO_HOLO_LIGHT_MESSAGE = 11;
    private static final int DIALOG_YES_NO_DEFAULT_LIGHT_MESSAGE = 12;
    private static final int DIALOG_YES_NO_DEFAULT_DARK_MESSAGE = 13;
    private static final int DIALOG_PROGRESS_SPINNER = 14;

然后重载onCreateDialog,参数id为Dialog ID,可以根据id来创建需要的Dialog实例:

@Override
protected Dialog onCreateDialog(int id) {
 switch (id) {
 case DIALOG_YES_NO_MESSAGE:
 return new AlertDialog.Builder(AlertDialogSamples.this)
 .setIcon(R.drawable.alert_dialog_icon)
 .setTitle(R.string.alert_dialog_two_buttons_title)
 .setPositiveButton(R.string.alert_dialog_ok,
    new DialogInterface.OnClickListener() {
 public void onClick(DialogInterface dialog, int whichButton) {

 /* User clicked OK so do some stuff */
 }
 })
 .setNegativeButton(R.string.alert_dialog_cancel,
     new DialogInterface.OnClickListener() {
 public void onClick(DialogInterface dialog, int whichButton) {

 /* User clicked Cancel so do some stuff */
 }
 })
 .create();

 ...

显示Dialog:

showDialog(DIALOG_YES_NO_MESSAGE);  

App->Dialog目前通过14个例子来说明AlertDialog的多种用法:

OK Cancel dialog with a message

前面显示的代码就是这个例子的代码,使用AlertDialog.Builder创建一个AlertDialog示例 ,然后通过setIcon,setTitle,setPositiveButton,setNegativeButton设置这个对话框的图标,标 题,OK和Cancel Button。 标题也不知道是什么语言:-(。

OK Cancel dialog with a long message

这个例子中使用setMessage来显示一个很长的信息(可以有滚动条),并通过setNeutralButton 添加一个中间按钮。

List Dialog

AlertDialog 可以用来显示一组选项来获取用户选择。对应静态的选项可以先定义一个Array资源:

<!– Used in app/dialog examples –>
<string-array name=”select_dialog_items”>
<item>Command one</item>
< item>Command two</item>
< item>Command three</item>
< item>Command four</item>
< /string-array>

然后调用setItems 来显示这些选项:

    case DIALOG_LIST:
     return new AlertDialog.Builder(AlertDialogSamples.this)
     .setTitle(R.string.select_dialog)
     .setItems(R.array.select_dialog_items, new DialogInterface.OnClickListener() {
     public void onClick(DialogInterface dialog, int which) {  

     /* User clicked so do some stuff */
     String[] items = getResources().getStringArray(R.array.select_dialog_items);
     new AlertDialog.Builder(AlertDialogSamples.this)
     .setMessage("You selected: " + which + " , " + items[which])
     .show();
     }
     })
     .create();  

Progress dialog

这个例子显示了ProgressDialog的用法,ProgressDialog为AlertDialog的子类,ProgressDialog 无需通过AlertDialog.Builder 构造,可以直接通过构造函数来创建ProgressDialog的实例。ProgressDialog可以显示一个标题和一个进度条。因此比 AlertDialog多了几个方法:setProgressStyle ,setMax等来配置进度条的属性。

注: 这个例子还使用里Handler 来更新进度条,Handler将在后面的例子介绍。

    case DIALOG_PROGRESS:
     mProgressDialog = new ProgressDialog(AlertDialogSamples.this);
     mProgressDialog.setIcon(R.drawable.alert_dialog_icon);
     mProgressDialog.setTitle(R.string.select_dialog);
     mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
     mProgressDialog.setMax(MAX_PROGRESS);
     mProgressDialog.setButton(getText(R.string.alert_dialog_hide),
     new DialogInterface.OnClickListener() {
     public void onClick(DialogInterface dialog, int whichButton) {  

     /* User clicked Yes so do some stuff */
     }
     });
     mProgressDialog.setButton2(getText(R.string.alert_dialog_cancel),
     new DialogInterface.OnClickListener() {
     public void onClick(DialogInterface dialog, int whichButton) {  

     /* User clicked No so do some stuff */
     }
     });
     return mProgressDialog;  

Single choice list

AlertDialog 显示列表时,可以指定为单选或是多选。将前面List中的setItems方法改成setSingleChoiceItems可以使用RadioButton来显示列表:

    case DIALOG_SINGLE_CHOICE:
     return new AlertDialog.Builder(AlertDialogSamples.this)
     .setIcon(R.drawable.alert_dialog_icon)
     .setTitle(R.string.alert_dialog_single_choice)
     .setSingleChoiceItems(R.array.select_dialog_items2, 0,
     new DialogInterface.OnClickListener() {
     public void onClick(DialogInterface dialog, int whichButton) {  

     /* User clicked on a radio button do some stuff */
     }
     })
     .setPositiveButton(R.string.alert_dialog_ok,
     new DialogInterface.OnClickListener() {
     public void onClick(DialogInterface dialog, int whichButton) {  

     /* User clicked Yes so do some stuff */
     }
     })
     .setNegativeButton(R.string.alert_dialog_cancel,
     new DialogInterface.OnClickListener() {
     public void onClick(DialogInterface dialog, int whichButton) {  

     /* User clicked No so do some stuff */
     }
     })
     .create();  

Repeat alarm

这个例子调用setMultiChoiceItems 方法使用CheckButton来显示列表,表示可以多选

    case DIALOG_MULTIPLE_CHOICE:
     return new AlertDialog.Builder(AlertDialogSamples.this)
     .setIcon(R.drawable.ic_popup_reminder)
     .setTitle(R.string.alert_dialog_multi_choice)
     .setMultiChoiceItems(R.array.select_dialog_items3,
     new boolean[]{false, true, false, true, false, false, false},
     new DialogInterface.OnMultiChoiceClickListener() {
     public void onClick(DialogInterface dialog,
     int whichButton,
     boolean isChecked) {  

     /* User clicked on a check box do some stuff */
     }
     })
     .setPositiveButton(R.string.alert_dialog_ok,
     new DialogInterface.OnClickListener() {
     public void onClick(DialogInterface dialog, int whichButton) {  

     /* User clicked Yes so do some stuff */
     }
     })
     .setNegativeButton(R.string.alert_dialog_cancel,
     new DialogInterface.OnClickListener() {
     public void onClick(DialogInterface dialog, int whichButton) {  

     /* User clicked No so do some stuff */
     }
     })
     .create();  

Send Call to VoiceMail

上面例子中列表项都是通过定义Array资源来实现的,列表项还可以使用Content Provider作为数据源。这个例子使用通讯录中的记录作为数据源,如果在模拟器运行,请先添加几个Contacts。Content Provider介绍请参见Android ApiDemo示例解析(10):App->Activity->QuickContactsDemo

    case DIALOG_MULTIPLE_CHOICE_CURSOR:
    String[] projection = new String[] {
    Contacts.People._ID,
    Contacts.People.NAME,
    Contacts.People.SEND_TO_VOICEMAIL
    };
    Cursor cursor = managedQuery(Contacts.People.CONTENT_URI,
    projection, null, null, null);
    return new AlertDialog.Builder(AlertDialogSamples.this)
    .setIcon(R.drawable.ic_popup_reminder)
    .setTitle(R.string.alert_dialog_multi_choice_cursor)
    .setMultiChoiceItems(cursor,
    Contacts.People.SEND_TO_VOICEMAIL,
    Contacts.People.NAME,
    new DialogInterface.OnMultiChoiceClickListener() {
    public void onClick(DialogInterface dialog,
    int whichButton,
    boolean isChecked) {
    Toast.makeText(AlertDialogSamples.this,
    "Readonly Demo Only
    - Data will not be updated",
    Toast.LENGTH_SHORT).show();
    }
    })
    .create();  

Text Entry Dialog

最后一个例子是使用文本框来接受用户输入。AlertDialog也允许自定义UI,可以使用自定义的Layout做为AlertDialog的 UI。 理论上可以使用任意的Layout,这样可以避免使用派生Dialog的方法来自定义对话框。本例使用alert_dialog_text_entry ,其中定义里两个TextView显示Name:和Password:标签 ,两个EditText接受用户输入。 然后使用setView为AlertDialog定义自定义的UI。

    case DIALOG_TEXT_ENTRY:
    // This example shows how to add a custom layout to an AlertDialog
    LayoutInflater factory = LayoutInflater.from(this);
    final View textEntryView
    = factory.inflate(R.layout.alert_dialog_text_entry, null);
    return new AlertDialog.Builder(AlertDialogSamples.this)
    .setIcon(R.drawable.alert_dialog_icon)
    .setTitle(R.string.alert_dialog_text_entry)
    .setView(textEntryView)
    .setPositiveButton(R.string.alert_dialog_ok,
    new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {  

    /* User clicked OK so do some stuff */
    }
    })
    .setNegativeButton(R.string.alert_dialog_cancel,
    new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {  

    /* User clicked cancel so do some stuff */
    }
    })
    .create();  

时间: 2024-10-20 08:41:20

【起航计划 020】2015 起航计划 Android APIDemo的魔鬼步伐 19 App->Dialog Dialog样式的相关文章

【起航计划 002】2015 起航计划 Android APIDemo的魔鬼步伐 01

本文链接:[起航计划 002]2015 起航计划 Android APIDemo的魔鬼步伐 01 参考链接:http://blog.csdn.net/column/details/mapdigitapidemos.html?&page=12

【起航计划 031】2015 起航计划 Android APIDemo的魔鬼步伐 30 App-&gt;Preferences-&gt;Advanced preferences 自定义preference OnPreferenceChangeListener

前篇文章Android ApiDemo示例解析(31):App->Preferences->Launching preferences 中用到了Advanced preferences 中定义的AdvancedPreferences. 本篇具体介绍AdvancedPreferences, 这个例子称为Advanced ,是因为它涉及到了自定义Preference, 并在一个工作线程中刷新某个Preference的值. Preference 为显示在PreferenceActivity (一般以

【起航计划 012】2015 起航计划 Android APIDemo的魔鬼步伐 11 App-&gt;Activity-&gt;Save &amp; Restore State onSaveInstanceState onRestoreInstanceState

Save & Restore State与之前的例子Android ApiDemo示例解析(9):App->Activity->Persistent State 实现的UI类似,但功能和实现方法稍有不同. (9)是通过Shared Preferences 和 Activity 的onPause() ,和onResume()来保持UI中 EditText 的值. 本例是通过onSaveInstanceState(Bundle savedBundle) 来实现保持UI状态. 和onPaus

【起航计划 003】2015 起航计划 Android APIDemo的魔鬼步伐 02

01 API Demos ApiDemos 详细介绍了Android平台主要的 API,android 5.0主要包括下图几个大类,涵盖了数百api示例: 02 入口类 ApiDemos采用分类层次显示,ApiDemo是ApiDemos的入口类,继承自ListActivity,该类的主要功能是分类列出大类,进而更进一步显示示例. ListActivity可以看做为一个含有ListView的Activity,可以不用setContentView设置布局,除非你想定制自己的List布局,这样的话,你

【起航计划 007】2015 起航计划 Android APIDemo的魔鬼步伐 06 App-&gt;Activity-&gt;Forwarding Activity启动另外一个Activity finish()方法

Android应用可以包含多个Activity,某个Activity可以启动另外的Activity. 这些Activity采用栈结构来管理,新打开的Activity叠放在当前的Activity之上,当前的Activity停止运行. 当一个Activity停止运行时,Android系统保留其停止前的状态,当用户按下“Back”按键时,栈最上的Activity从栈顶退栈,之前的Activity移到栈顶,显示在屏幕上: 有些时候,当一个Activity启动新的Activity后,不希望把当前Activ

【起航计划 005】2015 起航计划 Android APIDemo的魔鬼步伐 04 App-&gt;Activity-&gt;Custom Dialog Dialog形式的Activity,Theme的使用,Shape的使用

App->Activity->Custom Dialog 例子使用Activity 来实现自定义对话框 类CustomDialogActivity本身无任何特别之处.关键的一点是其在AndroidManifest.xml中的定义: <activity android:name=".app.CustomDialogActivity" android:label="@string/activity_custom_dialog" android:them

【起航计划 006】2015 起航计划 Android APIDemo的魔鬼步伐 05 App-&gt;Activity-&gt;Custom Title 自定义标题栏

Android UI缺省的标题栏由android:label 定义,显示在屏幕左上角,Android允许Activity自定义标题栏,使用自定义Layout重新设置标题栏,比如实现Windows Mobile 风格的标题栏. App->Activity->Custom Title 重新将Activity标题栏定义为左右两个文本框,类CustomTitle,其Layout定义R.layout.custom_title_1如下,为一左一右两个文本框: <!-- Demonstrates ho

【起航计划 016】2015 起航计划 Android APIDemo的魔鬼步伐 15 App-&gt;Activity-&gt;Wallpaper 系统壁纸作为当前Activity的背景

Wallpaper介绍一个Activity如何通过Style把系统Wallpaper作为当前Activity的背景. 这是WallpaperActivity在AndroidManifest.xml中的定义: <activity android:name=".app.WallpaperActivity" android:label="@string/activity_wallpaper" android:theme="@style/Theme.Wall

【起航计划 026】2015 起航计划 Android APIDemo的魔鬼步伐 25 App-&gt;Notification-&gt;Status Bar 状态栏显示自定义的通知布局,省却声音、震动

这个例子的Icons Only 和 Icons and marquee 没有什么特别好说明的. 而Use Remote views in balloon 介绍了可以自定义在Extended Status bar显示Notification的Layout,Extended Status Bar缺省显示Notification 是一个图标后接文字,对应大多数情况是够用了.但如果有需要也可以使用自定义的Layout在Extented Status bar显示Notification,方法是通过Remo