注意:该代码只适用于当次简单调用对话框,当遇到用到bundle多次调用或者传递信息是需要借助onPrepareDialog,但是这样的方法已经不被推荐。
该activity代码里面实现了多种常用的对话框,android的对话框常见的可以有两种实现方式:
AlertDialog方式
Dialog样式的activity方式
该代码实现的是AlertDialog,生命周期存在于调用的activity。
在开发中,常见的对话框包括几个部分,标题,正文和按钮,在实现对话框时候,可以很容易调用api实现。
new AlertDialog.Builder(AlertDialogSamples.this) .setIconAttribute(android.R.attr.alertDialogIcon) .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 */ } }) .show();
注意:以上方法虽然可以实现对话框,但是调用show()方法会有可能产生内存泄漏,及当其他进程销毁该activity时候,详细内容会在后面介绍。
因此我们看到demo中使用的是在onCreateDialog(int id)中生成,而使用showDialog(int id)方法调用。
以下是程序代码,其中set***开头的方法是设置对话框样式的方法,很容易理解,不赘述。
public class AlertDialogSamples extends Activity { 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 MAX_PROGRESS = 100; private ProgressDialog mProgressDialog; private int mProgress; private Handler mProgressHandler; @Override protected Dialog onCreateDialog(int id) { switch (id) { case DIALOG_YES_NO_MESSAGE: return new AlertDialog.Builder(AlertDialogSamples.this) .setIconAttribute(android.R.attr.alertDialogIcon) .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(); case DIALOG_YES_NO_OLD_SCHOOL_MESSAGE: return new AlertDialog.Builder(AlertDialogSamples.this, AlertDialog.THEME_TRADITIONAL) .setIconAttribute(android.R.attr.alertDialogIcon) .setTitle(R.string.alert_dialog_two_buttons_title) .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }) .setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }) .create(); case DIALOG_YES_NO_HOLO_LIGHT_MESSAGE: return new AlertDialog.Builder(AlertDialogSamples.this, AlertDialog.THEME_HOLO_LIGHT) .setIconAttribute(android.R.attr.alertDialogIcon) .setTitle(R.string.alert_dialog_two_buttons_title) .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }) .setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }) .create(); case DIALOG_YES_NO_LONG_MESSAGE: return new AlertDialog.Builder(AlertDialogSamples.this) .setIconAttribute(android.R.attr.alertDialogIcon) .setTitle(R.string.alert_dialog_two_buttons_msg) .setMessage(R.string.alert_dialog_two_buttons2_msg) .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { /* User clicked OK so do some stuff */ } }) .setNeutralButton(R.string.alert_dialog_something, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { /* User clicked Something 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(); case DIALOG_YES_NO_ULTRA_LONG_MESSAGE: return new AlertDialog.Builder(AlertDialogSamples.this) .setIconAttribute(android.R.attr.alertDialogIcon) .setTitle(R.string.alert_dialog_two_buttons_msg) .setMessage(R.string.alert_dialog_two_buttons2ultra_msg) .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { /* User clicked OK so do some stuff */ } }) .setNeutralButton(R.string.alert_dialog_something, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { /* User clicked Something 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(); 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(); case DIALOG_PROGRESS: mProgressDialog = new ProgressDialog(AlertDialogSamples.this); mProgressDialog.setIconAttribute(android.R.attr.alertDialogIcon); mProgressDialog.setTitle(R.string.select_dialog); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.setMax(MAX_PROGRESS); mProgressDialog.setButton(DialogInterface.BUTTON_POSITIVE, getText(R.string.alert_dialog_hide), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { /* User clicked Yes so do some stuff */ } }); mProgressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, 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; case DIALOG_SINGLE_CHOICE: return new AlertDialog.Builder(AlertDialogSamples.this) .setIconAttribute(android.R.attr.alertDialogIcon) .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(); 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(); case DIALOG_MULTIPLE_CHOICE_CURSOR: String[] projection = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.SEND_TO_VOICEMAIL }; Cursor cursor = managedQuery(ContactsContract.Contacts.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, ContactsContract.Contacts.SEND_TO_VOICEMAIL, ContactsContract.Contacts.DISPLAY_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(); 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) .setIconAttribute(android.R.attr.alertDialogIcon) .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(); } return null; } /** * Initialization of the Activity after it is first created. Must at least * call {@link android.app.Activity#setContentView(int)} to * describe what is to be displayed in the screen. */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.alert_dialog); /* Display a text message with yes/no buttons and handle each message as well as the cancel action */ Button twoButtonsTitle = (Button) findViewById(R.id.two_buttons); twoButtonsTitle.setOnClickListener(new OnClickListener() { public void onClick(View v) { showDialog(DIALOG_YES_NO_MESSAGE); } }); /* Display a long text message with yes/no buttons and handle each message as well as the cancel action */ Button twoButtons2Title = (Button) findViewById(R.id.two_buttons2); twoButtons2Title.setOnClickListener(new OnClickListener() { public void onClick(View v) { showDialog(DIALOG_YES_NO_LONG_MESSAGE); } }); /* Display an ultra long text message with yes/no buttons and handle each message as well as the cancel action */ Button twoButtons2UltraTitle = (Button) findViewById(R.id.two_buttons2ultra); twoButtons2UltraTitle.setOnClickListener(new OnClickListener() { public void onClick(View v) { showDialog(DIALOG_YES_NO_ULTRA_LONG_MESSAGE); } }); /* Display a list of items */ Button selectButton = (Button) findViewById(R.id.select_button); selectButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { showDialog(DIALOG_LIST); } }); /* Display a custom progress bar */ Button progressButton = (Button) findViewById(R.id.progress_button); progressButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { showDialog(DIALOG_PROGRESS); mProgress = 0; mProgressDialog.setProgress(0); mProgressHandler.sendEmptyMessage(0); } }); /* Display a radio button group */ Button radioButton = (Button) findViewById(R.id.radio_button); radioButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { showDialog(DIALOG_SINGLE_CHOICE); } }); /* Display a list of checkboxes */ Button checkBox = (Button) findViewById(R.id.checkbox_button); checkBox.setOnClickListener(new OnClickListener() { public void onClick(View v) { showDialog(DIALOG_MULTIPLE_CHOICE); } }); /* Display a list of checkboxes, backed by a cursor */ Button checkBox2 = (Button) findViewById(R.id.checkbox_button2); checkBox2.setOnClickListener(new OnClickListener() { public void onClick(View v) { showDialog(DIALOG_MULTIPLE_CHOICE_CURSOR); } }); /* Display a text entry dialog */ Button textEntry = (Button) findViewById(R.id.text_entry_button); textEntry.setOnClickListener(new OnClickListener() { public void onClick(View v) { showDialog(DIALOG_TEXT_ENTRY); } }); /* Two points, in the traditional theme */ Button twoButtonsOldSchoolTitle = (Button) findViewById(R.id.two_buttons_old_school); twoButtonsOldSchoolTitle.setOnClickListener(new OnClickListener() { public void onClick(View v) { showDialog(DIALOG_YES_NO_OLD_SCHOOL_MESSAGE); } }); /* Two points, in the light holographic theme */ Button twoButtonsHoloLightTitle = (Button) findViewById(R.id.two_buttons_holo_light); twoButtonsHoloLightTitle.setOnClickListener(new OnClickListener() { public void onClick(View v) { showDialog(DIALOG_YES_NO_HOLO_LIGHT_MESSAGE); } }); mProgressHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (mProgress >= MAX_PROGRESS) { mProgressDialog.dismiss(); } else { mProgress++; mProgressDialog.incrementProgressBy(1); mProgressHandler.sendEmptyMessageDelayed(0, 100); } } }; } }开发者可以使用该代码依次看一看每个对话框是什么样子的
该代码实现的只是简单的对话框,对于多次调用或者更新信息等动态信息的对话框是有问题的,因为,他的回调方法只能调用一次,以后多次调用时的数据都是第一次的,不适用于Bundle传递数据的使用场景。