2

有没有人设法制作可以处理以下所有要求的对话框:

  1. 在轮换更改期间保留(不会使用 android:configChanges 属性)
  2. 在激活屏幕保护程序(或转到 HOME)并返回 Activity 时保留
  3. 在关闭另一个对话框之后立即显示一个对话框。
  4. 在另一个对话框之后立即显示一个对话框会在两个对话框上添加旋转。

两个连续对话的解释:一个对话显示一个问题“您确定要...?”。然后在用户的积极响应下执行操作,并在对话框中显示结果。这应该是一个非常普遍的情况。

这是我尝试过的一些方法:

  • 使用 AlertDialog.show() 而不是 showDialog()。在 onSaveInstanceState 中成功保存状态(包括它的单击操作)以在 onCreate 中读取它。通过这种方式,对话在旋转后重新创建。连续显示两个对话框也没有问题,即项目符号 2 和 3。但是最后一件事没有工作。为了不泄漏窗口,我必须删除 onSaveInstanceState 中的对话框(无论如何它都会被删除)。然后,当我激活手机上的屏幕保护程序回来时,我发现无法重新创建它。有人知道屏幕保护程序后返回时会调用哪个代码吗?当我测试它时,onCreate、onResume、onRestoreInstanceState 等都没有被调用。

  • 使用 showDialog 方法。这适用于项目符号 1 和 3,即在旋转期间保留状态(如果使用静态对话框引用),并且它还可以正确处理屏幕保护程序。然而,第 2 条是有问题的。由于“窗口已经聚焦,忽略焦点增益..”,第二个对话框根本不想显示,或者对话框混淆了,或者第一个对话框的操作在没有询问用户的情况下执行。为了演示一些问题,我创建了下面的快速测试代码。

在模拟器上运行此测试代码并旋转第二个对话框将使其泄漏窗口,然后再次显示第一个对话框。

main.xml
 <Button android:layout_width="wrap_content" 
android:layout_height="wrap_content"
android:text="Perform action"
android:onClick="performAction" />


public class ShowDialogTest extends Activity {

private static final int DIALOG_QUESTION = 0;
private static final int DIALOG_INFO = 1;

private static AlertDialog questionDialog;
private static AlertDialog infoDialog;

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

@Override
public void onResume() {
    super.onResume();

    showQuestionDialog();
}

/**
 * Button click which will bring the dialogs back up.
 */
public void performAction(View v) {
    showQuestionDialog();
}

private void showInfoDialog() {
    createInfoDialog();
    showDialog(DIALOG_INFO);
}

private void showQuestionDialog() {
    createQuestionDialog();
    showDialog(DIALOG_QUESTION);
}

private void createInfoDialog() {
    infoDialog = new AlertDialog.Builder(this).create();

    infoDialog.setTitle("The result");
    infoDialog.setMessage("Info about the result of the action");

    DialogInterface.OnClickListener onClick1 = new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
        }
    };

    infoDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK", onClick1);
}

private void createQuestionDialog() {
    questionDialog = new AlertDialog.Builder(this).create();

    questionDialog.setTitle("A Question");
    questionDialog.setMessage("Are you sure?");

    DialogInterface.OnClickListener onClick = new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // Do something here ..

            // Alert the user about the result
            showInfoDialog();
        }
    };

    DialogInterface.OnClickListener onCancelClick = new OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
        }
    };

    questionDialog
            .setButton(DialogInterface.BUTTON_POSITIVE, "OK", onClick);
    questionDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel",
            onCancelClick);
}

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case DIALOG_QUESTION:
        return questionDialog;
    case DIALOG_INFO:
        return infoDialog;
    }

    // Error case (should be handled better ;)
    return new Dialog(this);
}

PS。使用创建对话框方法的原因是因为 Activity 需要在显示对话框之前将自定义文本和按钮操作放入对话框。这在代码中没有显示。DS

我已经阅读了其他一些论坛帖子并尝试了其他事情。请仅在您知道如何解决此问题而不产生新问题的情况下回答。当然,非常欢迎您在评论中提出建议。

感谢您的时间

4

2 回答 2

0

主要问题是我在 Activity 中而不是在 onCreateDialog() 方法中声明了对话框。即要这样做:

private static AlertDialog questionDialog;

确保还在 onCreateDialog() 方法中声明 OnClickListener 对象。

这确保满足第 1、3 和 4 条。由于使用了 showDialog(),所以满足了第 2 条。这根本不适用于 AlertDialog.show() 方法。

于 2012-03-07T15:40:34.610 回答
0

尝试这个:

@Override
protected Dialog onCreateDialog(int id) {
    AlertDialog dialog = new AlertDialog.Builder(this).create();
    if(id == yourCodeValue){
    LayoutInflater inflator = LayoutInflater.from(context);
    View view = inflator.inflate(R.layout.yourview, null);
    Button positive = (Button)view.findViewById(R.id.btn_positive);
    Button negative = (Button)view.findViewById(R.id.btn_negative);

    positive.setOnClickListener(new Button.OnClickListener(){
        public void onClick(View v) {
            removeDialog(0);
        }
    });

    negative.setOnClickListener(new Button.OnClickListener(){
        public void onClick(View v) {
            removeDialog(0);
        }
    });


    dialog.setView(view);
   }
    return dialog;
}

使用 显示此对话框showDialog(int value)

它将解决您的前 2 点和第 3 点和第 4 点,这取决于您如何处理它。

于 2011-08-25T12:25:51.563 回答