每次尝试运行此简单应用程序时,都会出现此错误:
无法添加窗口-令牌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();
}
}
我只想知道为什么。这可能是一个菜鸟问题。但任何帮助将不胜感激。
答案 0 :(得分:1)
就我而言,它只是通过将getApplicationContext()
更改为this
而起作用。
使用getApplicationContext()
的原因是指用于应用程序级别的整个应用程序。对话框是活动的一部分,因此,您不能使用应用程序级上下文来初始化对话框。
快乐编码
答案 1 :(得分:0)
发生这种情况是因为您在创建活动之前显示弹出框太早,并且将参数this
引用到活动的上下文,该上下文在创建活动之前为空!
为避免使用BadTokenException
,您需要推迟显示弹出窗口,直到调用onCreate()
方法为止,这意味着将显示活动窗口。
这就是为什么将代码放入onCreate