showDialog()管理两个连续的对话框,旋转事件和屏幕保护程序/ HOME按钮

时间:2011-08-25 12:13:13

标签: android rotation alertdialog showdialog

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

  1. 在旋转更改期间保留(不会使用android:configChanges属性)
  2. 在激活屏幕保护程序(或转到HOME)并返回活动
  3. 时保留
  4. 在另一个被取消后立即显示一个对话框。
  5. 在另一个对话框之后立即显示一个对话框,在两个对话框上添加旋转。
  6. 两个连续对话框的说明:一个对话框显示一个问题“你确定要......?”。然后,在用户的肯定响应下执行操作,并在对话框中显示结果。这应该是一个非常普遍的情况。

    以下是我尝试过的一些内容:

    • 使用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

    我已经阅读了其他一些论坛帖子并尝试过其他内容。如果您知道如何在没有创建新问题的情况下解决此,请回答。当然,非常欢迎您在评论中提出建议。

    感谢您的时间

2 个答案:

答案 0 :(得分: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点......

答案 1 :(得分:0)

主要问题是我在Activity中而不是在onCreateDialog()方法中声明了对话框。即执行此操作:

private static AlertDialog questionDialog;

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

这确保了子弹1,3和4的完成。由于使用了showDialog(),因此实现了子弹2。这根本不适用于AlertDialog.show()方法。