Android 在运行时更改应用程序语言

Android 在运行时更改应用程序语言,android,configuration,runtime,sharedpreferences,locale,Android,Configuration,Runtime,Sharedpreferences,Locale,我试图在运行时实现应用程序语言切换,一旦用户在应用程序首选项中更改了语言。我的首选项片段中有以下代码: public class Fragment_Preferences extends PreferenceFragment { private SharedPreferences.OnSharedPreferenceChangeListener prefListener; @Override public void onCreate(Bundle savedInstanceState) {

我试图在运行时实现应用程序语言切换,一旦用户在应用程序首选项中更改了语言。我的首选项片段中有以下代码:

public class Fragment_Preferences extends PreferenceFragment {

private SharedPreferences.OnSharedPreferenceChangeListener prefListener;

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());

    prefListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
        public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {

            Log.i("Pref changed", "Settings key changed: " + key);
            if(key.equals("language_preference"))
            {
                String system_language = Locale.getDefault().getLanguage().toUpperCase();
                String preference_language = Common_Methods.get_preference_language(getActivity());
                Toast.makeText(getActivity(), "Pref changed: "+preference_language, Toast.LENGTH_SHORT).show();
                Common_Methods.set_app_interface_language(getActivity(), system_language, preference_language);
            }

        }
    };
    prefs.registerOnSharedPreferenceChangeListener(prefListener);
}
}

这是我在Common_Methods类中的set_app_interface_language方法:

当我在“首选项”中更改语言时,会收到祝酒词消息。我知道这个方法是有效的,因为我也从我的Fragment_Main调用它。但是语言在运行时没有改变-我必须退出应用程序并重新打开它,只有在那时我才能看到变化


那么,在不重新启动应用程序的情况下,如何在运行时更改应用程序语言?谢谢

好的,我想我解决了这个问题:我不是在SharedReferences.OnSharedPreferenceChangeListener中调用Common_Methods.set_app_interface_语言,而是在Fragment_Main的onRestart方法中调用


我还更改了set_app_interface_语言以返回新配置。一旦返回,我将其传递给onConfigurationChanged方法以重新创建片段。现在,我确实遇到了未恢复的活动暂停。。。设备屏幕关闭后的错误消息。在谷歌搜索了一下之后,我意识到这是一个非致命的异常,但我仍然使用处理程序将重新创建延迟1毫秒,并让片段正确地重新启动。我还在我的公共_方法中设置了另一个方法,以检查是否对应用程序语言进行了任何更改,并仅在该方法返回true时重新创建片段;我在onRestart中调用了这个方法,它给应用程序带来了一些性能提升,因为现在不需要每次应用程序重新启动时都重新创建片段。

你能再试一次吗。getActivity.recreateI尝试在OnSharedPreferenceChangeListener中执行此操作,但没有任何结果,仍然使用相同的语言…在OnConfiguration Changed中执行此操作。。方法在当前活动的manifest add onConfigChanged=locale OK中,我设置了set\u app\u interface\u language return配置,并在Fragment\u首选项中创建了onConfigurationChange方法,并从OnSharedPreferenceChangeListener调用它。它确实改变了我的选项菜单的语言,但没有改变整个应用程序的语言。另外,当我在清单中添加configChange=locale时。那么,我应该如何改变整个应用程序的语言呢?
public static void set_app_interface_language(Context context, String system_language, String preference_language)
{
    if(!preference_language.equals(system_language))
    {
        Locale locale = new Locale(preference_language.toLowerCase());
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
    }
}