有没有人设法建立可以满足以下所有要求的对话框:


在轮换更改期间保留(不会使用android:configChanges属性)
在激活屏幕保护程序(或转到主屏幕)并返回到“活动”时被保留
在另一个对话框之后立即显示一个对话框。
取消显示一个对话框,紧接着另一个对话框,在两个对话框上添加旋转。


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

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


使用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。使用创建对话框方法的原因是,活动需要在显示对话框之前将自定义文本和按钮操作放入对话框。这没有显示在代码中。 DS

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

感谢您的时间

最佳答案

尝试这个:

@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点,这取决于您如何处理。

08-18 17:12
查看更多