我的Android应用程序中有一个语言设置。我将当前语言保存到SharedPreferences中,并且我有一个onSharedPreferencesChanged,它会重新启动堆栈中的所有活动,以便以正确的语言显示它们。
这就像魅力一样,但语言设置显示在对话框中,所以当我点击我想要更改它的语言时,共享首选项会发生变化,然后我会出现泄漏窗口错误。
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);
}
我在行builder.show()中得到一个泄漏窗口,因为我在共享首选项更改时重新启动所有活动。如何在不收到此错误的情况下显示对话框并重新启动我的活动?
提前致谢
答案 0 :(得分:1)
解释Abdallah的回答尝试将dismiss()
作为onClick
回调方法中的第一个语句移动。
编辑:首先,在致电alert = builder.create();
后,您应致电alert.show()
而不是builder.show()
。此外,如果您在评论中提到修改,则不应再收到错误。
答案 1 :(得分:0)
您的代码在退出活动后尝试显示对话框。
为了防止这种情况,您应该在重新启动活动之前解除()对话框。