在应用程序中切换语言而无需重新启动(Android)

4
从片段(设置)中按下名为 DialogFragmentTextView,在其中更改应用程序的设置(语言),如何关闭 DialogFragment,应用设置而不重新启动整个应用程序?
理想情况下,可以在 SingleChoice 选择对话框上立即更改语言。通过重新启动,一切都能正常工作。这是 DialogFragment 的代码:
public class LanguageDialogFragment extends DialogFragment {

    final String[] itemsLang = {"English", "Russian", "Ukraine"};
    final String[] items = {"en", "ru", "uk"};
    String lang;
    MainActivity activity = new MainActivity();

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Выберите свой родной язык")
                .setSingleChoiceItems(itemsLang, -1, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int item) {
                        lang = items[item];

                    }
                })

                .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        App.prefs.saveLanguage(lang);
                        App.changeLang(lang);

                        reload();

                    }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                    }
                });

        return builder.create();
    }

    private void reload() {
        Intent intent = getActivity().getIntent();
        getActivity().finish();
        Intent LaunchIntent = getActivity().getPackageManager().getLaunchIntentForPackage(App.context.getPackageName());
        startActivity(LaunchIntent);
    }
}

以下是我想要实现的应用程序示例:https://play.google.com/store/apps/details?id=com.funeasylearn.english 其中包含的截图: enter image description here enter image description here
1个回答

0

尝试下面的代码。您必须基于用户选择的语言创建一个新的区域设置,将其设置为当前区域设置并重新启动您的活动。请注意,如果在进行区域设置切换时其他活动处于活动状态,则可能需要重新启动它们。

public class LanguageDialogFragment extends DialogFragment {

    private final String[] itemsLang = {"English", "Russian", "Ukraine"};
    private final String[] items = {"en", "ru", "uk"};
    private String lang;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Выберите свой родной язык")
            .setSingleChoiceItems(itemsLang, -1, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int item) {
                    lang = items[item];

                }
            }).setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    //When user submits, restart the activity in
                    //the new language
                    restartActivityInLanguage(lang);

                }
            }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    //Do nothing
                }
            });

        return builder.create();
    }

    private void restartActivityInLanguage(String language) {
        Locale locale = new Locale(language);
        Configuration config = new Configuration();
        config.locale = locale;
        Resources resources = getResources();
        resources.updateConfiguration(config, resources.getDisplayMetrics());
        getActivity().recreate();
    }
}

不是完美的解决方案,Application类的静态变量和jni库将不会重新初始化.. - blueware
我不想重启我的应用程序,因为应用程序正在执行一些任务,例如录制屏幕。所以,在Android 7.0上,除了重启应用程序之外,是否有其他解决方案? - PriyankaChauhan
1
嘿,你找到答案了吗?我现在也有同样的问题。 - user8549135

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接