在Android中显示对话框时出现问题

时间:2019-06-05 22:13:55

标签: java android

每次尝试运行此简单应用程序时,都会出现此错误:

无法添加窗口-令牌null无效;您的活动正在进行吗?

但是,如果我更改此行:

vdlgDialogToShow = new Dialog(this);

并将其添加到onCreate,它可以正常工作。

public class MainActivity extends AppCompatActivity {

private Button vbtnShowDialog;
private Dialog vdlgDialogToShow;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    vbtnShowDialog = findViewById(R.id.btnShowDialog);

    vbtnShowDialog.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            displayValidateEmailPopup();

        }
    });

}

public void displayValidateEmailPopup(){

    // Criando variável necessária para mostrar a Dialog
    vdlgDialogToShow = new Dialog(getApplicationContext());

    vdlgDialogToShow.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

    // Construindo Dialog
    vdlgDialogToShow.setContentView(R.layout.dialog);
    ImageView ivCloseWarningPopup = vdlgDialogToShow.findViewById(R.id.ivWarningDialogCloseImage);
    TextView vtvDialogTitleText = vdlgDialogToShow.findViewById(R.id.tvWarningDialogTitle);
    TextView vtvDialogBodyText = vdlgDialogToShow.findViewById(R.id.tvWarningDialogBodyText);
    ImageView vivDialogImage = vdlgDialogToShow.findViewById(R.id.ivWarningDialogImage);
    Button vbtnEnviarEmailConfirmacao = vdlgDialogToShow.findViewById(R.id.btnWarningDialogButton);

    // Populando os campos da Dialog
    vtvDialogTitleText.setText(R.string.warning_dialog_email_nao_confirmado_title);
    vtvDialogBodyText.setText(R.string.warning_dialog_email_nao_confirmado_body);
    vivDialogImage.setImageResource(R.drawable.ic_mail_white_dialog_warning);
    vbtnEnviarEmailConfirmacao.setText(R.string.enviar_email_button_text);

    // Verificando se a imagem que representa o fechamento da Dialog foi clicada
    ivCloseWarningPopup.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            vdlgDialogToShow.dismiss();
        }
    });

    // Verificando se o Botão de enviar email de confirmação foi clicado
    vbtnEnviarEmailConfirmacao.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Verificando se o dispositivo está conectado à rede
        }
    });

    vdlgDialogToShow.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

    // Exibindo Dialog
    vdlgDialogToShow.show();

}
}

我只想知道为什么。这可能是一个菜鸟问题。但任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

就我而言,它只是通过将getApplicationContext()更改为this而起作用。 使用getApplicationContext()的原因是指用于应用程序级别的整个应用程序。对话框是活动的一部分,因此,您不能使用应用程序级上下文来初始化对话框。

快乐编码

答案 1 :(得分:0)

发生这种情况是因为您在创建活动之前显示弹出框太早,并且将参数this引用到活动的上下文,该上下文在创建活动之前为空!

为避免使用BadTokenException,您需要推迟显示弹出窗口,直到调用onCreate()方法为止,这意味着将显示活动窗口。

这就是为什么将代码放入onCreate

时效果很好的原因