|
先看过效果图:
图1 输入框默认文字为"这是一个普通对话框。"
图2 当点击"显示普通对话框"后,将弹出一个对话框
图3 点击图2中的对话框的确定按钮, 输入框里输入自己的内容
图4 点击图3中的“显示普通对话框”后弹出对话框
第一步:建立res/values/string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">普通对话框</string>
<string name="button">显示普通对话框</string>
<string name="title">普通对话框</string>
<string name="ok">确定</string>
<string name="message">这是一个普通对话框。</string>
</resources>
复制代码
第二步:建立res/layout/common_dialog_layout.xml 用来创建输入框和“显示普通对话框”按钮 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
androidrientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<EditText android:id="@+id/editText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/message"/>
<Button android:id="@+id/button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/button"
/>
</LinearLayout>
复制代码
第三步: 分析:
关于src/com/mycommondialog/activity/CommonDialogActivity.java
1.首先对“显示普通对话框”按钮进行事件监听,即当点击这个按钮后显示对话框
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View view) {
showDialog(COMMON_DIALOG);
}
};
button.setOnClickListener(listener);//对button事件监听
复制代码
这里showDialog(int)用来显示对话框的,是系统自带的方法,当点击button产生时间后,调用该方法,首先该方法会判断Activity是否保存了对话框对象
(1)如果未保存则调用onCreateDialog(int),然后再调用onPrepareDialog(int, Dialog)
(2)如果保存了对话框对象,则直接调用onPrepareDialog(int, Dialog),不会再去create,所以有时候当你再输入框里无论如何输入什么内容,对话框的内容都是第一次产生的。
2. Activity 未保存对话框对象,则会创建对话框,即调用onCreateDialog(int)
protected Dialog onCreateDialog(int id) {
EditText editText = (EditText) findViewById(R.id.editText);
switch(id) {
case COMMON_DIALOG:
Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.drawable.dialog);
builder.setTitle(R.string.button);
builder.setMessage(editText.getText());
DialogInterface.OnClickListener listener =
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
removeDialog(COMMON_DIALOG);
}
};
builder.setPositiveButton(R.string.ok, listener);
dialog = builder.create();
break;
}
return dialog;
}
复制代码
需要new AlertDialog.Builder(this)用来存放Dialog的内容(如图标,标题和信息),this是针对此Activity的。
setPositiveButton表示中间的那个button按钮(一般情况下button有三个按钮,此处只显示中间的那个按钮)
removeDialog(int)是用来清除Activity保存下来的Dialog对象,如果不加removeDialog将会导致无论在对话框里输入什么内容,
弹出来的对话框始终都是第一次保留下来的,这里所以要加上它
3. 关于onPrepareDialog(int, Dialog), 每次点击“显示普通对话框”按钮都会去调用此方法。
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
dialog.show();
}
复制代码
dialog.show()其实意义不大,加与不加系统都会调用show的,而且只显示一个对话框,dialog中iSSHowing()来判断是否该对话框正在显示了,为了验证可以将onPrepareDialog(int, Dialog)改成下面情况(只针对下列改动)
protected void onPrepareDialog(int id, Dialog dialog) {
dialog.show();
dialog.show();
dialog.show();
dialog.show();
dialog.show();
dialog.show();
}
复制代码
或者
protected void onPrepareDialog(int id, Dialog dialog) {
}
复制代码
结果dialog显示一个,而不会有多个对话框出现。
关于整个CommonDialogActivity代码如下(src/com/mycommondialog/activity/CommonDialogActivity.java)
package com.mycommondialog.activity;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
/**
*
* @author jamesliu
*
*/
public class CommonDialogActivity extends Activity {
final int COMMON_DIALOG = 1;
private Dialog dialog = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.common_dialog_layout);
Button button = (Button) findViewById(R.id.button);
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View view) {
showDialog(COMMON_DIALOG);
}
};
button.setOnClickListener(listener);
}
/*
* 使用onCreateDialog(int)来管理对话框的状态,
* 那么每次对话框被解除时,
* 该对话框对象的状态会被Activity保存. 调用
* removeDialog(int)将所有该对象的内部引用
* 移除 如本程序那样,如果不加removeDialog,
* 那么显示的是第一次的内容
*/
@Override
protected Dialog onCreateDialog(int id) {
EditText editText = (EditText) findViewById(R.id.editText);
switch (id) {
case COMMON_DIALOG:
Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.drawable.dialog);
builder.setTitle(R.string.button);
builder.setMessage(editText.getText());
DialogInterface.OnClickListener listener =
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 将此处移除后,无论怎么修改EditText内容
// 每次点击显示普通对话框,总是第一次的内容
// 如果想更新EditText内容就得加removeDialog
removeDialog(COMMON_DIALOG);
}
};
builder.setPositiveButton(R.string.ok, listener);
dialog = builder.create();
break;
default:
break;
}
Log.e("onCreateDialog", "onCreateDialog");
return dialog;
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
Log.e("onPrepareDialog", "onPrepareDialog");
}
}
复制代码
最后贴出目录结构
CommonDialogDemo.rar (165.04 KB, 下载次数: 3) |
|