Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 显示对话框并重新启动活动getting LeakedWindow错误_Android_Android Dialog - Fatal编程技术网

Android 显示对话框并重新启动活动getting LeakedWindow错误

Android 显示对话框并重新启动活动getting LeakedWindow错误,android,android-dialog,Android,Android Dialog,我的android应用程序中有语言设置。我将当前语言保存到SharedReferences中,并且我有一个onSharedPreferencesChanged,它重新启动堆栈中的所有活动,以便它们可以以正确的语言显示 这就像一个符咒,但语言设置会显示在一个对话框中,因此当我单击要将其更改为的语言时,共享首选项会更改,然后我会得到一个泄漏的窗口错误 public void showDialog(View v) { final CharSequence[] items = { res

我的android应用程序中有语言设置。我将当前语言保存到SharedReferences中,并且我有一个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);
}
我在line builder.show()中得到一个泄漏的窗口,因为我正在重新启动共享首选项更改时的所有活动。如何显示对话框并重新启动活动而不出现此错误


提前感谢

您的代码试图在退出活动后显示一个对话框


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

解释Abdallah的答案时,请尝试将
关闭()
作为
onClick
回调方法中的第一条语句上移


编辑:首先在调用
alert=builder.create()之后
您应该调用
alert.show()
而不是
builder.show()
。此外,在注释中提到的修改之后,您不应该再收到错误。

您会得到一个泄漏的窗口,因为
AlertDialog.Builder
正在构造函数中引用
。你能把你所有的代码都贴出来吗?我不确定重新启动时您在做什么似乎您在关闭之前创建的AlertDialog之前完成了()活动。请参阅下面的答案,这仍然是泄漏的窗口:(只是为了测试,别再叫祝酒词了。