显示对话框并重新启动一个Activity获取LeakedWindow错误

时间:2014-10-22 20:02:52

标签: android android-dialog

我的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()中得到一个泄漏窗口,因为我在共享首选项更改时重新启动所有活动。如何在不收到此错误的情况下显示对话框并重新启动我的活动?

提前致谢

2 个答案:

答案 0 :(得分:1)

解释Abdallah的回答尝试将dismiss()作为onClick回调方法中的第一个语句移动。

编辑:首先,在致电alert = builder.create();后,您应致电alert.show()而不是builder.show()。此外,如果您在评论中提到修改,则不应再收到错误。

答案 1 :(得分:0)

您的代码在退出活动后尝试显示对话框。

为了防止这种情况,您应该在重新启动活动之前解除()对话框。