Android 显示对话框并重新启动活动getting LeakedWindow错误
我的android应用程序中有语言设置。我将当前语言保存到SharedReferences中,并且我有一个onSharedPreferencesChanged,它重新启动堆栈中的所有活动,以便它们可以以正确的语言显示 这就像一个符咒,但语言设置会显示在一个对话框中,因此当我单击要将其更改为的语言时,共享首选项会更改,然后我会得到一个泄漏的窗口错误Android 显示对话框并重新启动活动getting LeakedWindow错误,android,android-dialog,Android,Android Dialog,我的android应用程序中有语言设置。我将当前语言保存到SharedReferences中,并且我有一个onSharedPreferencesChanged,它重新启动堆栈中的所有活动,以便它们可以以正确的语言显示 这就像一个符咒,但语言设置会显示在一个对话框中,因此当我单击要将其更改为的语言时,共享首选项会更改,然后我会得到一个泄漏的窗口错误 public void showDialog(View v) { final CharSequence[] items = { res
public void showDialog(View v) {
final CharSequence[] items = { res.getString(R.string.english),
res.getString(R.string.spanish) };
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(res.getString(R.string.change_language));
builder.setSingleChoiceItems(items, selected,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int item) {
switch (item) {
case 0: // English
if (selected == 0) {
Toast.makeText(
SettingsActivity.this,
res.getString(R.string.current_language),
Toast.LENGTH_LONG).show();
break;
}
changeLocale("en");
break;
case 1: // Spanish
if (selected == 1) {
Toast.makeText(
SettingsActivity.this,
res.getString(R.string.current_language),
Toast.LENGTH_LONG).show();
break;
}
changeLocale("es");
break;
}
alert.dismiss();
}
});
alert = builder.create();
builder.show();
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
if (key.equals("language")) {
restartActivity();
}
}
此方法位于“我的所有活动”的父活动中:
public void restartActivity() {
Intent intent = getIntent();
finish();
startActivity(intent);
}
我在line builder.show()中得到一个泄漏的窗口,因为我正在重新启动共享首选项更改时的所有活动。如何显示对话框并重新启动活动而不出现此错误
提前感谢您的代码试图在退出活动后显示一个对话框
为了防止出现这种情况,您应该在重新启动活动之前关闭()对话框。解释Abdallah的答案时,请尝试将
关闭()
作为onClick
回调方法中的第一条语句上移
编辑:首先在调用
alert=builder.create()之后
您应该调用alert.show()
而不是builder.show()
。此外,在注释中提到的修改之后,您不应该再收到错误。您会得到一个泄漏的窗口,因为AlertDialog.Builder
正在构造函数中引用此
。你能把你所有的代码都贴出来吗?我不确定重新启动时您在做什么似乎您在关闭之前创建的AlertDialog之前完成了()活动。请参阅下面的答案,这仍然是泄漏的窗口:(只是为了测试,别再叫祝酒词了。