android模式對話框
A. android中的對話框怎麼寫
Activities提供了一種方便管理的創建、保存、回復的對話框機制,例如onCreateDialog(int),onPrepareDialog(int,Dialog),showDialog(int),dismissDialog(int)等方法,如果使用這些方法的話,Activity將通過getOwnerActivity()方法返回該Activity管理的對話框(dialog).
onCreateDialog(int):當你使用這個回調函數時,Android系統會有效的設置這個Activity為每個對話框的所有者,從而自動管理每個對話框的狀態並掛靠到Activity上。這樣,每個對話框繼承這個Activity的特定屬性。比如,當一個對話框打開時,菜單鍵顯示為這個Activity定義的選項菜單,音量鍵修改Activity使用的音頻流。
showDialog(int):當你想要顯示一個對話框時,調用showDialog(intid)方法並傳遞一個唯一標識這個對話框的整數。當對話框第一次被請求時,Android從你的Activity中調用onCreateDialog(intid),你應該在這里初始化這個對話框Dialog。這個回調方法被傳以和showDialog(intid)相同的ID。當你創建這個對話框後,在Activity的最後返回這個對象。
onPrepareDialog(int,Dialog):在對話框被顯示之前,Android還調用了可選的回調函數onPrepareDialog(intid,Dialog).如果你想在每一次對話框被打開時改變它的任何屬性,你可以定義這個方法。這個方法在每次打開對話框時被調用,而onCreateDialog(int)僅在對話框第一次打開時被調用。如果你不定義onPrepareDialog(),那麼這個對話框將保持和上次打開時一樣。這個方法也被傳遞以對話框的ID,和在onCreateDialog()中創建的對話框對象。
dismissDialog(int):當你准備關閉對話框時,你可以通過對這個對話框調用dismiss()來消除它。如果需要,你還可以從這個Activity中調用dismissDialog(intid)方法,這實際上將為你對這個對話框調用dismiss()方法。如果你想使用onCreateDialog(intid)方法來管理你對話框的狀態(就如同在前面的章節討論的那樣),然後每次你的對話框消除的時候,這個對話框對象的狀態將由該Activity保留。如果你決定不再需要這個對象或者清除該狀態是重要的,那麼你應該調用removeDialog(intid)。這將刪除任何內部對象引用而且如果這個對話框正在顯示,它將被消除。
下面是幾種對話框的效果
圖一:
圖1效果:該效果是當按返回按鈕時彈出一個提示,來確保無誤操作,採用常見的對話框樣式。
代碼:
創建對話框方法dialog()
protected void dialog() {
AlertDialog.Builder builder = new Builder(Main.this);
builder.setMessage("確認退出嗎?"); builder.setTitle("提示"); builder.setPositiveButton("確認", new OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss(); Main.this.finish();
}
}); builder.setNegativeButton("取消", new OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}); builder.create().show();
}
在onKeyDown(int keyCode, KeyEvent event)方法中調用此方法
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
dialog();
}
return false;
}
圖2效果:改變了對話框的圖表,添加了三個按鈕
Dialog dialog = new AlertDialog.Builder(this).setIcon(
android.R.drawable.btn_star).setTitle("喜好調查").setMessage(
"你喜歡李連傑的電影嗎?").setPositiveButton("很喜歡",
new OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Toast.makeText(Main.this, "我很喜歡他的電影。",
Toast.LENGTH_LONG).show();
}
}).setNegativeButton("不喜歡", new OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Toast.makeText(Main.this, "我不喜歡他的電影。", Toast.LENGTH_LONG)
.show();
}
}).setNeutralButton("一般", new OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Toast.makeText(Main.this, "談不上喜歡不喜歡。", Toast.LENGTH_LONG)
.show();
}
}).create(); dialog.show();
圖3效果:信息內容是一個簡單的View類型
new AlertDialog.Builder(this).setTitle("請輸入").setIcon(
android.R.drawable.ic_dialog_info).setView(
new EditText(this)).setPositiveButton("確定", null)
.setNegativeButton("取消", null).show();
圖4效果:信息內容是一組單選框
new AlertDialog.Builder(this).setTitle("復選框").setMultiChoiceItems(
new String[] { "Item1", "Item2" }, null, null)
.setPositiveButton("確定", null)
.setNegativeButton("取消", null).show();
圖5效果:信息內容是一組多選框
new AlertDialog.Builder(this).setTitle("單選框").setIcon(
android.R.drawable.ic_dialog_info).setSingleChoiceItems(
new String[] { "Item1", "Item2" }, 0,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).setNegativeButton("取消", null).show();
圖6效果:信息內容是一組簡單列表項
new AlertDialog.Builder(this).setTitle("列表框").setItems(
new String[] { "Item1", "Item2" }, null).setNegativeButton(
"確定", null).show();
圖7效果:信息內容是一個自定義的布局
1.布局文件
<?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: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="100dip"/></LinearLayout>
2.調用代碼
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.dialog,
(ViewGroup) findViewById(R.id.dialog)); new AlertDialog.Builder(this).setTitle("自定義布局").setView(layout)
.setPositiveButton("確定", null)
.setNegativeButton("取消", null).show();
B. 【譯】Android材質組件的動手實踐:Dialogs
Android MDC 系列文章:
這篇文章將介紹 Dialogs 組件的功能和API。要了解如何處理Android的Material Components的初始設置(包括Gradle依賴關系和創建應用程序主題),請參閱我的原始文章:
為Android設置Material Components主題
對話框是組件,通常帶有模式窗口,顯示在應用程序內容的前面。它們用於告知用戶可能包含關鍵信息和/或需要做出決定的任務。它們有目的地打斷電流,並一直顯示在屏幕上,直到被解散或採取措施為止,因此應謹慎使用。
從設計的角度來看,可以在不同的場景中使用三種主要類型的對話框:
上面所有這些都具有共同的特徵:遮蓋應用程序內容的背景稀鬆布(可以選擇輕按以關閉對話框)和表面容器。
注意:存在第四種類型: 全屏對話框 。為此, 官方文檔 建議使用 *DialogFragment* 和資源限定符一起確定其顯示方式。這不在本文的討論范圍之內,因此不會涉及。
可以使用來實現所有上述對話框類型 MaterialAlertDialogBuilder 。該構建器類 AlertDialog 使用Material Design規范和主題來配置和實例化。
顯示對話框的基本方法如下:
配置更改(例如設備旋轉)後,上述方法將不會保留對話框。為了實現這一點,我們需要花一段 DialogFragment 時間使用 MaterialAlertDialogBuilder 來提供 Dialog :
DialogFragment 可以使用 導航體系結構組件 顯示,也可以通過 Fragment 或 Activity 通過以下方式手動顯示:
可以通過將參數傳遞給來實現上面(和更多)三種對話框中列出的所有特徵 MaterialAlertDialogBuilder 。下面列出了其中一些。
注意:在以下大多數情況下,將使用硬編碼值。該構建器還提供資源ID的重載。
注意:對話框的中間區域可以被支持文本或一組特定類型的項目佔用。這些不能合並。
存在幾個主題疊加層,用於更改對話框的總體布局。這些主題覆蓋變體繼承自 ThemeOverlay.MaterialComponents.MaterialAlertDialog ,每個都有一個可選的後綴:
實施全局自定義Material AlertDialog 主題疊加層時,請在您的應用程序主題中使用 materialAlertDialogTheme 屬性引用它。
另外,還有一個輔助 MaterialAlertDialogBuilder 構造函數,它接受覆蓋的主題資源ID:
可以使用三個「材料主題」子系統為主題設置「材料警報」對話框: 顏色 , 版式 和 形狀 。我們已經在上面的 「選擇主題疊加層」 部分中顯示了要使用 的主題疊加層 。除此之外, AlertDialog 可以通過擴展樣式並使用屬性 在 主題疊加層中引用自定義樣式。 MaterialAlertDialog.MaterialComponents``alertDialogStyle
有沒有具體的屬性自定義在一個對話框中使用的顏色,但 colorPrimary , colorSecondary , colorSurface 和各自的「關於」在您的應用程序使用的主題會自動調整對話框顏色顏色改變時。
對話框文本元素將採用 fontFamily 您在應用程序主題中定義的屬性。操作按鈕的樣式將根據 textAppearanceButton 您在應用主題中設置的樣式進行設置。
在主題疊加層中,您還可以使用 屬性為正文文本專門設置樣式。
可以使用該 shapeAppearance 屬性自定義對話框背景的形狀。默認為 。
我希望這篇文章對對話框以及如何在您的Android應用中使用對話框提供了一些見識。如果您有任何疑問,想法或建議,那麼我很樂意收到您的來信!
在Twitter上找到我 @ricknout
C. 如何在Android中顯示系統對話框
任意Activity彈出對話框,那你可以用service 服務中彈出一個全局的 以下是代碼 .Builder builder = new AlertDialog.Builder(this);builder.setIcon(R.drawable.ic);builder.setTitle("標題");builder.setMessage("提示文字");builder.setPositiveButton(R.string.btn_update, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //增加按鈕,回調事件 });builder.setCancelable(false);//彈出框不可以換返回鍵取消AlertDialog dialog = builder.create();dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);//將彈出框設置為全局dialog.setCanceledOnTouchOutside(false);//失去焦點不會消失dialog.show();
D. android中Dialog和PopupWindow的區別
Android中的對話框有兩種:PopupWindow和AlertDialog。它們都可以實現彈窗功能,但是他們之間有一些差別,下面總結了一點。 (1)Popupwindow在顯示之前一定要設置寬高,Dialog無此限制。 (2)Popupwindow默認不會響應物理鍵盤的back,除非顯示設置了popup.setFocusable(true);而在點擊back的時候,Dialog會消失。 (3)Popupwindow不會給頁面其他的部分添加蒙層,而Dialog會。 (4)Popupwindow沒有標題,Dialog默認有標題,可以通過dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);取消標題 (5)二者顯示的時候都要設置Gravity。如果不設置,Dialog默認是Gravity.CENTER。 (6)二者都有默認的背景,都可以通過setBackgroundDrawable(new ColorDrawable(android.R.color.transparent));去掉。 其中最本質的差別就是:AlertDialog是非阻塞式對話框:AlertDialog彈出時,後台還可以做事情;而PopupWindow是阻塞式對話框:PopupWindow彈出時,程序會等待,在PopupWindow退出前,程序一直等待,只有當我們調用了dismiss方法的後,PopupWindow退出,程序才會向下執行。這兩種區別的表現是:AlertDialog彈出時,背景是黑色的,但是當我們點擊背景,AlertDialog會消失,證明程序不僅響應AlertDialog的操作,還響應其他操作,其他程序沒有被阻塞,這說明了AlertDialog是非阻塞式對話框;PopupWindow彈出時,背景沒有什麼變化,但是當我們點擊背景的時候,程序沒有響應,只允許我們操作PopupWindow,其他操作被阻塞。 我們在寫程序的過程中可以根據自己的需要選擇使用Popupwindow或者是Dialog。
E. Android 寮鍙 瀵硅瘽妗咲ialog dismiss鍜宧ide鏂規硶鐨勫尯鍒
cancel浼氬幓璋僤ismiss鐨勶紝濡傛灉璋冪敤鐨刢ancel鐨勮瘽灝卞彲浠ョ洃鍚珼ialogInterface.OnCancelListener 錛屽備笅
F. android怎麼設置activity為對話框模式
將activity設置成對話框樣式,只需在activity屬性裡面增加下面一句代碼:
然後可以activity左邊增加一個小圖片,讓它更像dialog,代碼如下:
但是上面的設置往往還不能滿足實際需求,因為樣子、背景和一些屬性使用的默認的,下面使用style自定義一個,以後可以根據實際需要自行更改: