android的無標題dialog以及dialog樣式的表單普通方法彈出alert後,取消標題還會有小部分高度,這個倒會好些:先定義一個樣式 res/values/styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="FullHeightDialog"
parent="android:style/Theme.Dialog">
<item name="android:windowNoTitle">true</item>
</style>
</resources>
彈出alert時稍微修改一下:
Dialog dialog = new Dialog(this, R.style.FullHeightDialog);
dialog.setContentView(R.layout.article_comment);
dialog.show();
你可以彈出一個表單,也和alert類似的效果。
首先修改一下表單的屬性:
修改AndroidManifest.xml 檔案:
<activity android:name=".Test"
android:theme="@android:style/Theme.Dialog">
</activity>
這是聲明樣式,下面是開啟activity後,oncreate時加點參數:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
this.setContentView(R.layout.article_comment);
}
這樣會出現背景模糊的效果。
在之前的學習過程中我們已經知道,Android應用中最常用的螢幕顯示開發是基於Activity的,但是,在很多情況下我們需要顯示一個對話方塊或浮動表單來完成一些簡單的任務,比如需要讓使用者輸入一些內容,或讓使用者確認一些資訊。
在Android中,我們可以通過兩種方式來建立對話方塊:
1. 藉助Dialog類,或它的子類(如AlertDialog)
2. 使用Activity的對話方塊主題
使用Dialog類:
讓我們先來看下如何藉助Dialog類建立對話方塊,首先,我們需要定義一個繼承了Dialog類的子類:
class MyDialog extends Dialog {
public MyDialog(Context context) {
super(context);
}
}
然後,為這個對話方塊的內容定義一個布局檔案,比如:
<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout
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”>
<TextView
android:id=”@+id/nameMessage”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:text=”Enter Name:”></TextView>
<EditText
android:id=”@+id/nameEditText”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:textSize=”18sp”></EditText>
<LinearLayout
android:id=”@+id/buttonLayout”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:layout_gravity=”center_horizontal”>
<Button
android:id=”@+id/okButton”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”OK”></Button>
<Button
android:id=”@+id/cancelButton”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”Cancel”></Button>
</LinearLayout>
</LinearLayout>
接著,將上面這份布局檔案應用到我們的對話方塊上來:
class MyDialog extends Dialog {
….
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(”TestApp”, “Dialog created”);
setContentView(R.layout.mydialog);
}
}
現在,我們就可以調用這個對話方塊類的show方法來讓它顯示:
…
MyDialog dialog = new MyDialog(context);
dialog.show();
…
對話方塊組件的事件處理機制和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 android:name=”.DialogActivity” android:label=”@string/activity_dialog” android:theme=”@android:style/Theme.Dialog”>
…
</activity>