在以前的學習過程當中咱們已經知道,Android應用中最經常使用的屏幕顯示開發是基於Activity的,可是,在不少狀況下咱們須要顯示一個對話框或浮動窗體來完成一些簡單的任務,好比須要讓用戶輸入一些內容,或讓用戶確認一些信息。 在Android中,咱們能夠經過兩種方式來建立對話框: 1. 藉助Dialog類,或它的子類(如AlertDialog) 2. 使用Activity的對話框主題 使用Dialog類: 讓咱們先來看下如何藉助Dialog類建立對話框,首先,咱們須要定義一個繼承了Dialog類的子類:php
class MyDialog extends Dialog { public MyDialog(Context context) { super(context); } }android
而後,爲這個對話框的內容定義一個佈局文件,好比:ide
android:id=」@+id/widget28″ android:layout_width=」fill_parent」 android:layout_height=」fill_parent」 android:orientation=」vertical」 xmlns:android=」http://schemas.android.com/apk/res/android」> android:id=」@+id/nameMessage」 android:layout_width=」fill_parent」 android:layout_height=」wrap_content」 android:text=」Enter Name:」> android:id=」@+id/nameEditText」 android:layout_width=」fill_parent」 android:layout_height=」wrap_content」 android:textSize=」18sp」> android:id=」@+id/buttonLayout」 android:layout_width=」fill_parent」 android:layout_height=」wrap_content」 android:layout_gravity=」center_horizontal」> android:id=」@+id/okButton」 android:layout_width=」wrap_content」 android:layout_height=」wrap_content」 android:text=」OK」> android:id=」@+id/cancelButton」 android:layout_width=」wrap_content」 android:layout_height=」wrap_content」 android:text=」Cancel」> 接着,將上面這份佈局文件應用到咱們的對話框上來:學習 class MyDialog extends Dialog { …. @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(」TestApp」, 「Dialog created」); setContentView(R.layout.mydialog); } }ui 如今,咱們就能夠調用這個對話框類的show方法來讓它顯示:this … MyDialog dialog = new MyDialog(context); dialog.show(); …xml 對話框組件的事件處理機制和Activity是相同的,讓咱們來看下如何處理對話框中的OK和Cancle按鈕的事件:對象 class MyDialog extends Dialog implements OnClickListener { private Button okButton; private Button cancelButton; private EditText nameEditText; protected void onCreate(Bundle savedInstanceState) { okButton = (Button) findViewById(R.id.okButton); cancelButton = (Button) findViewById(R.id.cancelButton); nameEditText = (EditText) findViewById(R.id.nameEditText); okButton.setOnClickListener(this); cancelButton.setOnClickListener(this); }繼承 public void onClick(View view) { switch (view.getId()) { case R.id.okButton: dismiss(); break; case R.id.cancelButton: cancel(); break; } } } 在對話框關閉時,對話框類的dismiss()方法將會被調用,該方法能夠被對話框自身調用,也能夠被其餘外部代碼調用。 對話框支持「取消」功能,「取消」的含義是指再也不須要執行對話框上的任何功能和動做。對話框的取消能夠經過調用cancel()方法來實現。取消對話框也將會自動調用dismiss()方法。 當用戶點擊手機設備上的「返回」按鈕時,屏幕上的對話框將會被取消,若是你想讓你的對話框不在這種狀況下被取消掉的話,你能夠以下設置你的對話框: setCancelable(false); 對話框的取消和關閉事件能夠經過OnCancelListener和OnDismissListener兩個監聽器來被監聽處理。 從對話框中返回信息: 如今,到了咱們要從對話框上獲取用戶輸入的值,將它返回到主調的Activity中的時候了。然而, Dialog類並無提供能夠直接返回這些值的方法…可是,咱們可使用本身建立的監聽類: public interface MyDialogListener { public void onOkClick(String name); public void onCancelClick(); } 咱們的對話框類的構造方法同時須要做一點小小的修改: public MyDialog(Context context, MyDialogListener listener) { super(context); this.listener = listener; } 接着,你就得在建立這個對話框的時候提供一個已經實現了MyDialogListener這接口的監聽器實現對象了。 而後,咱們要在對話框的onclick方法中傳出這個值: public void onClick(View view) { switch (view.getId()) { case R.id.okButton: listener.onOkClick(nameEditText.getText().toString()); dismiss(); break; case R.id.cancelButton: cancel(); break; } } 使用AlertDialog:AlertDialog類是Dialog類的子類。它默認提供了3個按鈕和一個文本消息。這些按鈕能夠按須要來使他們顯示或隱藏。下列代碼將建立一個AlertDialog對話框,對話框上將向用戶展現一個問題以及備選的yes/no答案: AlertDialog dialog = new AlertDialog.Builder(context).create(); dialog.setMessage(」Do you play cricket?」); dialog.setButton(」Yes」, myOnClickListener); dialog.setButton2(」No」, myOnClickListener); dialog.show(); myOnClickListener這個事件監聽器的代碼能夠相似以下: public void onClick(DialogInterface dialog, int i) { switch (i) { case AlertDialog.BUTTON1: break; case AlertDialog.BUTTON2: break; } } AlertDialog.Builder:AlertDialog類中有一個內部類,名爲‘Builder’,Builder類提供了爲對話框添加多選或單選列表,以及爲這些列表添加事件處理的功能。另外,這個Builder類將AlertDialog對話框上的3個按鈕按照他們的位置分別稱呼爲:PositiveButton, NeutralButton, NegativeButton 下列代碼是一個多選列表的例子: new AlertDialog.Builder(context) .setIcon(R.drawable.icon) .setTitle(R.string.alert_dialog_multi_choice) .setMultiChoiceItems( R.array.select_dialog_items, new boolean[]{false, true, false, true, false}, new DialogInterface.OnMultiChoiceClickListener() { public void onClick(DialogInterface dialog, int whichButton, boolean isChecked) { } }).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(); Activity託管對話框:Android也提供了建立對話框的快捷方式,在Activity中能夠經過如showDialog(), onCreateDialog(), onPrepareDialog(),dismissDialog(), removeDialog()等方法來建立和管理對話框。 Activity的onCreateDialog方法用於在建立並顯示對話框的時候調用,好比: @Override protected Dialog onCreateDialog(int id) { return new AlertDialog.Builder(this).setMessage(」How are you?」).setPositiveButton( 」Fine」, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }).setNegativeButton(」Not so good」, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } } ).create(); } 你能夠同時建立多個對話框,經過爲他們設置id參數來區分它們,而後能夠經過 showDialog(id)方法來顯示。 onCreateDialog方法只會在第一次調用showDialog方法時纔會被調用,在以後的showDialog()的調用中,對話框不是被新建出來的,而是直接顯示以前建立過的那些對話框。 若是你想要更新對話框的內容,你只要在 onPrepareDialog()中做相應的工做就能夠了,該方法會在對話框顯示以前進行調用。 dismissDialog()方法是用來關閉對話框的;removeDialog()方法用來將對話框從Activity的託管中移除(若是對已經移除的對話框從新進行調用showDialog ,則該對話框將進行從新建立)。 使用Dialog主題: 另一種簡單的顯示對話框的方式是讓Activity以Dialog的方式來工做(僞裝?) ,這種Activity被稱做浮動Activity。這種Activity能夠經過配置它的主題來實現,咱們能夠在AndroidManifest.xml中進行相似以下的配置: … 這樣,該Activity就會應用了 ‘Theme.Dialog’的主題而看起來像對話框了。 原文:http://www.fulema.com/viewthread.php?tid=13&extra=page%3D1 佈局
接着,將上面這份佈局文件應用到咱們的對話框上來:學習
class MyDialog extends Dialog { …. @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(」TestApp」, 「Dialog created」); setContentView(R.layout.mydialog); } }ui
如今,咱們就能夠調用這個對話框類的show方法來讓它顯示:this
… MyDialog dialog = new MyDialog(context); dialog.show(); …xml
對話框組件的事件處理機制和Activity是相同的,讓咱們來看下如何處理對話框中的OK和Cancle按鈕的事件:對象
class MyDialog extends Dialog implements OnClickListener { private Button okButton; private Button cancelButton; private EditText nameEditText; protected void onCreate(Bundle savedInstanceState) { okButton = (Button) findViewById(R.id.okButton); cancelButton = (Button) findViewById(R.id.cancelButton); nameEditText = (EditText) findViewById(R.id.nameEditText); okButton.setOnClickListener(this); cancelButton.setOnClickListener(this); }繼承
public void onClick(View view) { switch (view.getId()) { case R.id.okButton: dismiss(); break; case R.id.cancelButton: cancel(); break; } } }
在對話框關閉時,對話框類的dismiss()方法將會被調用,該方法能夠被對話框自身調用,也能夠被其餘外部代碼調用。 對話框支持「取消」功能,「取消」的含義是指再也不須要執行對話框上的任何功能和動做。對話框的取消能夠經過調用cancel()方法來實現。取消對話框也將會自動調用dismiss()方法。 當用戶點擊手機設備上的「返回」按鈕時,屏幕上的對話框將會被取消,若是你想讓你的對話框不在這種狀況下被取消掉的話,你能夠以下設置你的對話框:
setCancelable(false);
對話框的取消和關閉事件能夠經過OnCancelListener和OnDismissListener兩個監聽器來被監聽處理。 從對話框中返回信息: 如今,到了咱們要從對話框上獲取用戶輸入的值,將它返回到主調的Activity中的時候了。然而, Dialog類並無提供能夠直接返回這些值的方法…可是,咱們可使用本身建立的監聽類:
public interface MyDialogListener { public void onOkClick(String name); public void onCancelClick(); }
咱們的對話框類的構造方法同時須要做一點小小的修改:
public MyDialog(Context context, MyDialogListener listener) { super(context); this.listener = listener; }
接着,你就得在建立這個對話框的時候提供一個已經實現了MyDialogListener這接口的監聽器實現對象了。 而後,咱們要在對話框的onclick方法中傳出這個值:
public void onClick(View view) { switch (view.getId()) { case R.id.okButton: listener.onOkClick(nameEditText.getText().toString()); dismiss(); break; case R.id.cancelButton: cancel(); break; } }
使用AlertDialog:AlertDialog類是Dialog類的子類。它默認提供了3個按鈕和一個文本消息。這些按鈕能夠按須要來使他們顯示或隱藏。下列代碼將建立一個AlertDialog對話框,對話框上將向用戶展現一個問題以及備選的yes/no答案:
AlertDialog dialog = new AlertDialog.Builder(context).create(); dialog.setMessage(」Do you play cricket?」); dialog.setButton(」Yes」, myOnClickListener); dialog.setButton2(」No」, myOnClickListener); dialog.show();
myOnClickListener這個事件監聽器的代碼能夠相似以下:
public void onClick(DialogInterface dialog, int i) { switch (i) { case AlertDialog.BUTTON1: break; case AlertDialog.BUTTON2: break; } }
AlertDialog.Builder:AlertDialog類中有一個內部類,名爲‘Builder’,Builder類提供了爲對話框添加多選或單選列表,以及爲這些列表添加事件處理的功能。另外,這個Builder類將AlertDialog對話框上的3個按鈕按照他們的位置分別稱呼爲:PositiveButton, NeutralButton, NegativeButton 下列代碼是一個多選列表的例子:
new AlertDialog.Builder(context) .setIcon(R.drawable.icon) .setTitle(R.string.alert_dialog_multi_choice) .setMultiChoiceItems( R.array.select_dialog_items, new boolean[]{false, true, false, true, false}, new DialogInterface.OnMultiChoiceClickListener() { public void onClick(DialogInterface dialog, int whichButton, boolean isChecked) { } }).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();
Activity託管對話框:Android也提供了建立對話框的快捷方式,在Activity中能夠經過如showDialog(), onCreateDialog(), onPrepareDialog(),dismissDialog(), removeDialog()等方法來建立和管理對話框。 Activity的onCreateDialog方法用於在建立並顯示對話框的時候調用,好比:
@Override protected Dialog onCreateDialog(int id) { return new AlertDialog.Builder(this).setMessage(」How are you?」).setPositiveButton( 」Fine」, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }).setNegativeButton(」Not so good」, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } } ).create(); }
你能夠同時建立多個對話框,經過爲他們設置id參數來區分它們,而後能夠經過 showDialog(id)方法來顯示。 onCreateDialog方法只會在第一次調用showDialog方法時纔會被調用,在以後的showDialog()的調用中,對話框不是被新建出來的,而是直接顯示以前建立過的那些對話框。 若是你想要更新對話框的內容,你只要在 onPrepareDialog()中做相應的工做就能夠了,該方法會在對話框顯示以前進行調用。 dismissDialog()方法是用來關閉對話框的;removeDialog()方法用來將對話框從Activity的託管中移除(若是對已經移除的對話框從新進行調用showDialog ,則該對話框將進行從新建立)。 使用Dialog主題: 另一種簡單的顯示對話框的方式是讓Activity以Dialog的方式來工做(僞裝?) ,這種Activity被稱做浮動Activity。這種Activity能夠經過配置它的主題來實現,咱們能夠在AndroidManifest.xml中進行相似以下的配置:
…
這樣,該Activity就會應用了 ‘Theme.Dialog’的主題而看起來像對話框了。
原文:http://www.fulema.com/viewthread.php?tid=13&extra=page%3D1