在一个Activity中使用多个Dialog

[size=medium]
Android Dev-Guide 推荐重写Activity.onCreateDialog()方法来创建Dialog,这样Dialog就归属于这个Activity了。使用方法是这样的,Activity.showDialog()激发Activity.onCreateDialog()创建Dialog,然后显示之,便于多个Dialog的统一管理。注意,以后再用Activity.showDialog()显示同一个Dialog时,则不会调用Activity.onCreateDialog(),而是调用Activity.onPrepareDialog(),使用上一次显示Dialog时的状态。即
第一次:showDialog() -> onCreatedialog()
以后: showDialog() -> onPrepareDialog()

在示例代码中,分别用createExitDialog(),createListDialog(),createRadioDialog(),createCheckboxDialog(),创建4种Dialog,并在Activity中显示。示例代码如下:[/size]

package com.ipjmc.dialog;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

public class ShowDialogActivity extends Activity {
/** Called when the activity is first created. */
public static final String TAG = "ShowDialog";
public static final int ID_EXIT_DIALOG = 1;
public static final int ID_LIST_DIALOG = 2;
public static final int ID_RADIO_DIALOG = 3;
public static final int ID_CHECKBOX_DIALOG = 4;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

showDialog(ID_EXIT_DIALOG);
showDialog(ID_LIST_DIALOG);
showDialog(ID_RADIO_DIALOG);
showDialog(ID_CHECKBOX_DIALOG);
}

@Override
protected Dialog onCreateDialog(int id) {
// TODO Auto-generated method stub
Dialog dialog = null;
switch(id) {
case ID_EXIT_DIALOG :
dialog = createExitDialog();
break;
case ID_LIST_DIALOG :
dialog = createListDialog();
break;
case ID_RADIO_DIALOG :
dialog = createRadioDialog();
break;
case ID_CHECKBOX_DIALOG :
dialog = createCheckboxDialog();
break;
default :
break;
}
if (dialog != null) {
Log.i(TAG, dialog.toString());
} else {
Log.i(TAG, "dialog = null");
}
return dialog;
}

@Override
protected void onPrepareDialog(int id, Dialog dialog) {
// TODO Auto-generated method stub
super.onPrepareDialog(id, dialog);
}

//创建简单Dialog
public Dialog createExitDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure you want to exit?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
ShowDialogActivity.this.finish();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
return builder.create();
}

//创建ListDialog
public Dialog createListDialog() {
final CharSequence[] items = {"Red", "Green", "Blue"};

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Pick a color");
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
}
});
return builder.create();
}

//创建单选Dialog
public Dialog createRadioDialog() {
final CharSequence[] items = {"Red", "Green", "Blue"};

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Pick a color");
builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int position) {
Toast.makeText(getApplicationContext(), position + " -> " + items[position], Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
return builder.create();
}

//创建多选Dialog
public Dialog createCheckboxDialog() {
final CharSequence[] items = {"Red", "Green", "Blue"};
final boolean [] checked = new boolean [] {false, false, false};

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Pick a color");
builder.setMultiChoiceItems(items, checked, new DialogInterface.OnMultiChoiceClickListener() {

@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
// TODO Auto-generated method stub

}
});

builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
ShowDialogActivity.this.finish();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});

return builder.create();

}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想让多个 Activity Dialog 窗口都置顶,可以考虑使用一个辅助类来管理所有的 Dialog 窗口。以下是一种可行的实现方式: 1. 创建一个名为 `DialogManager` 的辅助类,并添加以下代码: ```java public class DialogManager { private static ArrayList<Dialog> sDialogs = new ArrayList<>(); public static void addDialog(Dialog dialog) { if (!sDialogs.contains(dialog)) { sDialogs.add(dialog); updateDialogs(); } } public static void removeDialog(Dialog dialog) { if (sDialogs.contains(dialog)) { sDialogs.remove(dialog); updateDialogs(); } } private static void updateDialogs() { Dialog topDialog = null; for (Dialog dialog : sDialogs) { if (dialog.isShowing()) { if (topDialog == null || dialog.getWindow().getAttributes().type > topDialog.getWindow().getAttributes().type) { topDialog = dialog; } } } if (topDialog != null) { topDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); topDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); } } } ``` 这个类维护了一个 `sDialogs` 静态成员变量,用于存储所有的 Dialog 窗口。`addDialog()` 和 `removeDialog()` 方法分别用于添加和删除 Dialog 窗口。`updateDialogs()` 方法会在 Dialog 窗口被添加或删除时调用,它会找到当前最顶层的 Dialog 窗口,并将其置顶。 2. 在每个需要显示 Dialog 窗口的 Activity ,重写 `onCreateDialog()` 方法,并在其添加以下代码: ```java @Override protected Dialog onCreateDialog(int id) { Dialog dialog = new Dialog(this); // 设置 Dialog 窗口的属性 DialogManager.addDialog(dialog); return dialog; } @Override protected void onStop() { super.onStop(); DialogManager.removeDialog(getDialog()); } ``` 这将会在每个 Activity 创建一个 Dialog 窗口,并将其添加到 `DialogManager` 进行管理。当 Activity 停止时,需要将其对应的 Dialog 窗口从 `DialogManager` 删除。 请注意,在添加 `TYPE_SYSTEM_ALERT` 类型的窗口时,需要申请 `android.permission.SYSTEM_ALERT_WINDOW` 权限。如果你的应用程序的 targetSdkVersion 是 26 或更高版本,则还需要在 AndroidManifest.xml 文件添加该权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值