Android:AlertDialog 不会在 Cancel() 或 Dismiss() 上关闭

Android: AlertDialog not closing on Cancel() nor on Dismiss()

我实现了一个 AlertDialog,它用作消息对话框。当用户键入消息时,他可以单击按钮 "SEND" 或按钮 "CANCEL"。按钮 "SEND" 工作正常,但取消按钮由于某种原因不起作用。

findViewById(R.id.contactfab).setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(Frontpage.this);
                final AlertDialog dialog = dialogBuilder.create();
                LayoutInflater inflater = Frontpage.this.getLayoutInflater();
                View dialogView = inflater.inflate(R.layout.dialog_contact, null);
                dialogBuilder.setView(dialogView);

                final EditText editText = (EditText) dialogView.findViewById(R.id.contactText);
                editText.setText("");
                dialogView.findViewById(R.id.send_button).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        String [] reciever = new String[]{"test@hotmail.com"};
                        String subject = ("Feedback");
                        Intent mailIntent = new Intent(Intent.ACTION_SEND);
                        mailIntent.putExtra(Intent.EXTRA_EMAIL, reciever);
                        mailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
                        mailIntent.putExtra(Intent.EXTRA_TEXT, editText.getText().toString());
                        mailIntent.setType("message/rfc822");
                        startActivity(Intent.createChooser(mailIntent, "Vælg en applikation til at sende din mail med"));
                    }
                });

                dialogView.findViewById(R.id.cancel_button).setOnClickListener(new View.OnClickListener()
                {
                    @Override
                    public void onClick(View view)
                    {
                        dialog.cancel();
                    }
                });

                dialogBuilder.show();
            }
        });

为了测试它是否在监听取消按钮,我试着让它在点击按钮时打印一个字符串。字符串被打印出来,但对话框没有关闭。 dialog.dismiss()dialog.dismiss()

都试过了

我错过了什么?

当您调用 dialogBuilder.show(); 时,它将使用提供给构建器的参数创建一个新的 AlertDialog 并立即显示该对话框。因此,这个新的 AlertDialog 将与使用 final AlertDialog dialog 声明的不同。简而言之,您的代码 dialog 声明将永远不会显示,因此 dialog.cancel()dialog.close() 不会产生任何影响。

按如下方式更改您的代码:

findViewById(R.id.contactfab).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view){
            final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(Frontpage.this);

            LayoutInflater inflater = Frontpage.this.getLayoutInflater();
            View dialogView = inflater.inflate(R.layout.dialog_contact, null);
            dialogBuilder.setView(dialogView);
            final EditText editText = (EditText) dialogView.findViewById(R.id.contactText);
            editText.setText("");
            final AlertDialog dialog = dialogBuilder.create();
            dialogView.findViewById(R.id.send_button).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String [] reciever = new String[]{"test@hotmail.com"};
                    String subject = ("Feedback");
                    Intent mailIntent = new Intent(Intent.ACTION_SEND);
                    mailIntent.putExtra(Intent.EXTRA_EMAIL, reciever);
                    mailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
                    mailIntent.putExtra(Intent.EXTRA_TEXT, editText.getText().toString());
                    mailIntent.setType("message/rfc822");
                    startActivity(Intent.createChooser(mailIntent, "Vælg en applikation til at sende din mail med"));
                }
            });

            dialogView.findViewById(R.id.cancel_button).setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View view) {
                    dialog.cancel();
                }
            });

            dialog.show();
        }
    });
}