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

时间:2014-07-12 18:47:11

标签: android configuration runtime sharedpreferences locale

一旦用户在应用偏好设置中进行语言更改,我就会尝试在运行时实现应用语言切换。我在PreferenceFragment中有这段代码:

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);
}

}

这是set_app_interface_language类中的Common_Methods方法:

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());
    }
}

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

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

1 个答案:

答案 0 :(得分:0)

好的,我想我已经解决了这个问题:我呼吁Common_Methods.set_app_interface_language不在SharedPreferences.OnSharedPreferenceChangeListener,而是在我的Fragment_Main的onRestart方法中。

我还更改了set_app_interface_language以返回新配置。一旦它返回 - 我将它传递给onConfigurationChanged方法来重新创建片段。现在,一旦我的设备屏幕关闭,我确实遇到了Performing pause of activity that is not resumed...错误消息。稍微搜索一下后,我意识到这是非致命的异常,但我仍然使用Handler将recreate()推迟1毫秒并让Fragment正常重启。我还在Common_Methods中设置了另一个方法,以检查是否对应用程序语言进行了任何更改,并仅在方法返回true时重新创建片段;我在onRestart中调用了这个方法,这为应用程序提供了一些性能提升,因为现在每次应用重启时都不需要重新创建片段。

相关问题