`
wayfarer
  • 浏览: 297649 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Dialog

阅读更多

Dialog是所有对话框的基类,但Dialog并非继承自View,而是直接从Object构造出来的。Dialog调用是异步调用,所以showDialog()时不会阻碍UI线程。

 

1. Activity托管对话框:
      Android提供了创建对话框的快捷方式,在Activity中可以通过如showDialog(int dialogId),dismissDialog(int dialogId),onCreateDialog(),onPrepareDialog(),removeDialog()等方法来创建和管理对话框。

      onCreateDialog(int dialogId)和onPrepareDialog(int dialogId, Dialog dialog)是Dialog的2个回调函数,showDialog()触发这两个回调函数的调用。同所有的onCreate()一样,其只在Dialog第一次生成的时候才会被调用,而onPrepareDialog()在每次执行showDialog()都会被调用(不管Dialog生成了没有)。如果你想要更新对话框的内容,你只要在onPrepareDialog()中作相应的工作就可以了,该方法会在对话框显示之前进行调用。

      dismissDialog()方法是用来关闭对话框的;removeDialog()方法用来将对话框从Activity的托管中移除(如果对已经移除的对话框重新进行调用showDialog ,则该对话框将进行重新创建)。

 

2. 常用Dialog

(1)AlertDialog

AlertDialog类是Dialog类的子类,它默认提供了3个按钮和一个文本消息,这些按钮可以按需要来使他们显示或隐藏。AlertDialog类中有一个内部静态类,名为“Builder”,Builder类提供了为对话框添加多选或单选列表,以及为这些列表添加事件处理的功能。另外,这个Builder类将AlertDialog对话框上的3个按钮按照他们的位置分别称呼为:PositiveButton, NeutralButton, NegativeButton。

(2)ProgressDialog

ProgressDialog.dialog = new ProgressDialog(context); 没有内部静态类,直接构造函数构造

 

3. 一个很特别的Dialog(由Activity转换而来) ,具体请参见参考doc中android.R.style部分
(1)AndroidManifest.xml中的activity的属性中增加:android :theme="@android :style/Theme.Dialog( Activity的对话框主题)。可使Activity变为Dialog(浮动窗口);
(2)AndroidManifest.xml中的activity的属性中增加:android:theme="@android:style/Theme.Translucent"(Activity半透明主题);

 

4. 示例代码

(1)自定义Dialog并获取Dialog中EditText的数据

public class MyDialog extends Dialog implements Button.OnClickListener {
	private Button okButton, cancelButton;
    private EditText nameEditText;
    private MyDialogListener listener;
    
	public MyDialog(Context context, MyDialogListener listener) {
		super(context);
        this.listener = listener;
	}
	protected void onCreate(Bundle savedInstanceState) {
		setContentView(R.layout.mydialog);
		
		okButton = (Button) findViewById(R.id.okButton);
        cancelButton = (Button) findViewById(R.id.cancelButton);
        okButton.setOnClickListener(this);
        cancelButton.setOnClickListener(this);
        
        nameEditText = (EditText) findViewById(R.id.nameEditText);
	}
	public void onClick(View v) {
		switch (v.getId()) {
        case R.id.okButton:
        	 listener.onOkClick(nameEditText.getText().toString());
             dismiss(); // 关闭Dialog
             break;
        case R.id.cancelButton:
        	 cancel(); // 取消Dialog, "取消"的含义是指不再需要执行对话框上的任何功能和动作, 取消对话框会自动调用dismiss()方法
             break;
		}
		/*
		 * 当用户点击手机设备上的“返回”按钮时,屏幕上的对话框将会被取消,
		 * 如果你想让你的对话框不在这种情况下被取消掉的话,你可以如下设置你的对话框:setCancelable(false);
		 * 对话框的取消和关闭事件可以通过OnCancelListener和OnDismissListener两个监听器来被监听处理。
		 */
	}
	
}
 
public class MainActivity extends Activity implements MyDialogListener {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MyDialog dialog = new MyDialog(this, this);
        dialog.show();
    }
	public void onCancelClick() {
	}
	public void onOkClick(String name) {
		Toast.makeText(this, name, Toast.LENGTH_LONG).show();
	}
}

interface MyDialogListener {
    public void onOkClick(String name);
    public void onCancelClick();
}

 

mydialog.xml

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:orientation="vertical">
	<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>

 

(2)

public class MainActivity2 extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        AlertDialog dialog = new AlertDialog.Builder(this).create();
        dialog.setMessage("Do you play cricket?");
        dialog.setButton("Yes", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				switch (which) {
		        case AlertDialog.BUTTON1:
		        	break;
		        case AlertDialog.BUTTON2:
		            break;
				}
			}
        });
        dialog.setButton2("No", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
			}
        });
        dialog.show();
    }
}

 

(3)托管Dialog

public class MainActivity extends Activity {
	private Button button1, button2, button3, button4;
	private Button.OnClickListener listener1, listener2, listener3, listener4;
	private final int DIALOG1 = 1, DIALOG2 = 2, DIALOG3 = 3, DIALOG4 = 4;
	
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        prepareListener();
    }
	
	protected Dialog onCreateDialog(int id) {
		switch (id) {
		case DIALOG1:
			return buildDialog(this, DIALOG1);
		case DIALOG2:
			return buildDialog(this, DIALOG2);
		case DIALOG3:
			return buildDialog(this, DIALOG3);
		case DIALOG4:
			return buildDialog(this, DIALOG4);
		}
		return null;
	}
	
	protected void onPrepareDialog(int id, Dialog dialog) {
		super.onPrepareDialog(id, dialog);
	}
	
	private Dialog buildDialog(Context context, int seq) {
		AlertDialog.Builder builder = new AlertDialog.Builder(context);
		builder.setIcon(R.drawable.alert_dialog_icon);
		if (DIALOG1 == seq) {
			builder.setTitle(R.string.alert_dialog_two_buttons_title);
			builder.setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					setTitle(R.string.alert_dialog_ok);
				}
			});
			builder.setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					setTitle(R.string.alert_dialog_cancel);
				}
			});
		}
		if (DIALOG2 == seq) {
			builder.setTitle(R.string.alert_dialog_two_buttons_msg);
			builder.setMessage(R.string.alert_dialog_two_buttons2_msg);
			
			// AlertDialog最多只能有3个Button
			builder.setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					setTitle(R.string.alert_dialog_ok);
				}
			});
			builder.setNeutralButton(R.string.alert_dialog_something, new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					setTitle(R.string.alert_dialog_something);
				}
			});
			builder.setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					setTitle(R.string.alert_dialog_cancel);
				}
			});
		}
		if (DIALOG3 == seq) {
			// LayoutInflater的inflate方法可以将一个XML布局变成一个View实例
			LayoutInflater inflater = LayoutInflater.from(this);
			View textEntryView = inflater.inflate(R.layout.alert_dialog_text_entry, null);
			builder.setTitle(R.string.alert_dialog_text_entry);
			
			// setView()真可以说是Dialog的一个精髓
			builder.setView(textEntryView);
			builder.setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					setTitle(R.string.alert_dialog_ok);
				}
			});
			builder.setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					setTitle(R.string.alert_dialog_cancel);
				}
			});
		}
		if (DIALOG4 == seq) {
			ProgressDialog dialog = new ProgressDialog(context);
			dialog.setTitle("Downding the songs...");
			dialog.setMessage("Please Waiting...");
			return dialog;
		}
		return builder.create();
	}

	private boolean prepareListener() {
		// init button
		button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);
        button3 = (Button) findViewById(R.id.button3);
        button4 = (Button) findViewById(R.id.button4);
        
        // init listener
		listener1 = new Button.OnClickListener() {
			public void onClick(View v) {
				showDialog(DIALOG1);
			}
		};
		listener2 = new Button.OnClickListener() {
			public void onClick(View v) {
				showDialog(DIALOG2);
			}
		};
		listener3 = new Button.OnClickListener() {
			public void onClick(View v) {
				showDialog(DIALOG3);
			}
		};
		listener4 = new Button.OnClickListener() {
			public void onClick(View v) {
				showDialog(DIALOG4);
			}
		};
		
		// bind listener
		button1.setOnClickListener(listener1);
        button2.setOnClickListener(listener2);
        button3.setOnClickListener(listener3);
        button4.setOnClickListener(listener4);
		return true;
	}
}

 

alert_dialog_text_entry.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <!-- android:textAppearance:设置字体, 系统自带的字体 -->
    <!-- android:capitalize:设置大小写;none首字母小写;words首字母大写 -->
    <TextView android:id="@+id/username_view"
    	android:layout_width="wrap_content"
    	android:layout_height="wrap_content"
    	android:layout_marginLeft="20dip"
    	android:layout_marginRight="20dip"
    	android:text="用户名"
    	android:textAppearance="?android:attr/textAppearanceMedium"
    />
    <EditText android:id="@+id/username_edit"
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	android:layout_marginLeft="20dip"
    	android:layout_marginRight="20dip"
    	android:capitalize="words"
    	android:textAppearance="?android:attr/textAppearanceMedium"
    />
    <TextView android:id="@+id/password_view"
    	android:layout_width="wrap_content"
    	android:layout_height="wrap_content"
    	android:layout_marginLeft="20dip"
    	android:layout_marginRight="20dip"
    	android:text="密码"
    	android:textAppearance="?android:attr/textAppearanceMedium"
    />
    <EditText android:id="@+id/password_edit"
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	android:layout_marginLeft="20dip"
    	android:layout_marginRight="20dip"
    	android:capitalize="none"
    	android:password="true"
    	android:textAppearance="?android:attr/textAppearanceMedium"
    />
</LinearLayout>

 

5.

分享到:
评论
3 楼 再_见孙悟空 2014-02-04  
写的不错
2 楼 zx273064010 2011-02-15  
                   
1 楼 hezhou_0521 2010-11-30  
如果把相应该的效果图附上,那多好啊。

相关推荐

    各种自定义Dialog 以及Dialog加载动画

    在Android开发中,自定义Dialog和Dialog加载动画是提升应用用户体验的重要手段。默认的Dialog样式虽然功能齐全,但在追求个性化和美观的今天,往往显得过于简单甚至有些过时。因此,开发者常常需要根据应用的设计...

    Android自定义Dialog多选对话框(Dialog+Listview+CheckBox)

    在Android开发中,自定义Dialog是一种常见的需求,用于提供一种轻量级的用户交互界面,如提示信息或者进行选择操作。本示例是关于如何创建一个具有多选功能的Dialog,结合了Dialog、ListView和CheckBox的使用。下面...

    自定义圆角的dialog

    在Android应用开发中,Dialog是一种重要的用户交互组件,它用于显示临时信息或提示用户进行选择。系统提供的默认Dialog样式虽然实用,但往往无法满足开发者对于界面个性化和用户体验优化的需求。因此,自定义Dialog...

    Android 控制关闭Dialog

    在Android开发中,Dialog是一种常见的用户交互元素,用于在用户界面中显示临时信息或进行简单的交互操作。通常,当我们使用AlertDialog构建一个对话框时,它的默认行为是在用户点击按钮(如"确定"或"取消")后自动...

    dialog动画进入退出的动画

    在Android开发中,Dialog是一种常见的用户交互元素,用于在主界面之上显示临时信息或进行简单的操作选择。在本文中,我们将深入探讨如何实现Dialog的进入和退出动画,并讲解如何去除Dialog的标题,以提供更加定制化...

    安卓Service中弹Dialog

    然而,有时我们需要在Service中显示一个`Dialog`来与用户进行交互,例如提示信息或获取用户确认。这涉及到Android系统服务的生命周期管理以及如何在非UI线程中正确地操作UI元素。 首先,理解`Service`的生命周期是...

    (仿照系统音量dialog)在广播中弹出系统级别dialog,并且dialog后边背景不变暗,并且可以获取焦点

    在Android开发中,系统级别的Dialog通常是指那些与系统服务交互,具有较高权限并能与系统界面无缝集成的对话框。这种Dialog通常是半透明的,显示在所有应用之上,且能够改变或控制系统的某些核心功能,比如音量调节...

    Android Dialog全屏显示、动画显示

    在Android开发中,自定义Dialog是一种常见的用户交互方式,它能提供更为丰富的界面和功能,以满足特定场景下的需求。本教程将详细讲解如何创建一个全屏显示且带有动画效果的自定义Dialog,并结合相机和图片选择的...

    Android 底部弹出dialog+动画

    在Android开发中,底部弹出Dialog是一种常见的交互方式,它用于显示临时信息或者提供用户一些简短的操作选项。本文将详细讲解如何实现一个带有动画效果的底部弹出Dialog,并通过具体的代码实例进行演示。 首先,...

    带图片的Dialog

    在Android开发中,Dialog是一种常见的用户交互元素,用于在主界面之上显示临时的通知或提示信息。"带图片的Dialog"是Dialog的一种自定义形式,它不仅包含文本信息,还能够展示图片,使得交互更加生动、直观。这个...

    自定义右上角带叉号Dialog Android 自定义layout Dialog

    在Android开发中,创建自定义对话框(Dialog)是一种常见的需求,这允许开发者根据应用的UI风格和功能需求定制对话框的布局和交互方式。本文将深入探讨如何创建一个自定义右上角带有关闭叉号的Dialog,并实现点击...

    Andorid Dialog 九种形式

    在Android开发中,Dialog是一种非常重要的用户界面组件,它用于在主界面之上显示临时的通知或交互窗口,以向用户展示信息、请求输入或者确认操作。本文将深入探讨Android Dialog的九种常见形式,帮助开发者更好地...

    自定义dialog仿ios风格的dialog

    在Android开发中,自定义Dialog是一种常见的需求,它允许开发者创建具有独特设计和功能的对话框,以符合应用的品牌风格或提供更丰富的用户体验。本文将深入探讨如何在Android中实现一个仿iOS风格的Dialog,并根据...

    Android自定义显示内容的Dialog

    这里我们将深入探讨两种实现自定义显示内容的Dialog的方法:继承Dialog和继承PopupWindow。 首先,我们来看继承Dialog的方式。Dialog是Android系统提供的一个内置组件,用于展示与用户交互的重要信息。要自定义...

    Android Dialog更改样式及显示位置

    在Android开发中,Dialog是一种常见的用户交互界面,用于在主线程中显示临时信息或进行简单的用户操作。默认情况下,Dialog会出现在屏幕中央,但开发者可以根据需求自定义其样式和显示位置。本文将深入探讨如何在...

    android 全屏弹出dialog,底部弹入,底部弹出+弹出dialog输入法

    在Android开发中,有时我们需要创建具有独特动画效果的对话框(Dialog)来增强用户体验。本文将详细介绍如何实现一个全屏弹出的Dialog,并且重点讨论如何实现底部弹入和底部弹出的效果,以及如何处理Dialog与输入法...

    js实现的dialog

    JavaScript 实现的 Dialog 对话框是一种常见的前端交互技术,它允许用户在不离开当前页面的情况下与应用程序进行交互。本文将详细介绍如何使用纯 JavaScript 来创建一个功能完备的 Dialog 模块,以及涉及到的相关...

    Android Dialog中加载GIF

    在Android开发中,有时我们需要在Dialog中展示动态内容,如GIF动图,来提供更丰富的用户交互体验。本文将详细讲解如何在Android Dialog中利用Glide库加载并播放GIF。 首先,Glide是一个非常流行的Android图片加载库...

    Android Dialog设置透明背景以及位置

    在Android开发中,Dialog是一种常见的用户交互组件,用于在主线程中显示临时信息或进行简单的操作选择。在设计用户界面时,有时我们可能希望Dialog具有透明背景或者可以自定义其显示位置,以达到更佳的视觉效果。本...

    Android Dialog与软键盘的正确打开方式

    在Android开发中,Dialog是一种常见的用户交互界面,用于显示临时信息或者进行简单的用户操作。而软键盘的管理和显示则是移动应用用户体验的关键因素之一。本文将深入探讨如何在Android中正确处理Dialog与软键盘的...

Global site tag (gtag.js) - Google Analytics