Home » Android » SharedPrefs is resetting after Setting Locale of the Android Application

SharedPrefs is resetting after Setting Locale of the Android Application

Posted by: admin May 14, 2020 Leave a comment

Questions:

I’ve create an activity to change the locale of the application to load resources of the selected language and I restart the application,moreover I’m keeping an integer value as the app state using sharedpreferences,after setting the locale via the following code,the next time that I open the application the mentioned state does not have the correct value!!!!But,when I remove the language setting there isn’t any problem with the state of the application!

myLocale = new Locale(lang);
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
res.updateConfiguration(conf, dm);
/*
 * Intent refresh = new Intent(this, AndroidLocalizeActivity.class);
 * startActivity(refresh); finish();
 */
PrefManager _p = new PrefManager(getApplicationContext(), PrefConfigNames.LANGUAGE_APP_CONFIG);
_p.setStringValue(GeneralPrefKeyNames.LANGUAGE, lang);

Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName());
i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(i);

setResult(RESULT_OK, null);
finish();

I cannot get what happens to sharedpreferences(I’ve used open source securepreferences (CodeProject article)in this app)

here!!!

Thanks in advance

Edit#1
PrefManager.java

public class PrefManager {

    private SecurePreferences _securePreferences = null;

    public PrefManager(Context context, String PrefName)
    {

        _securePreferences = new SecurePreferences(context, PrefName);
    }

    public void setStringValue(String key, String value)
    {

        _securePreferences.edit().putString(key, value).commit();
    }
}

Edit#2
Something which is so weird is that the state of the application stored in the sharedprefs has the correct value when I debug or run the application from eclipse (debug or run as an android application)!!!but when I rerun it on the phone it has the default value!!!Please help me solve this issue!

Edit#3
I found out that there was a problem with relaunching the application using the following lines,is there another way to relaunch the app without any problem???Or even a better way (to update the language without relaunching the app)?

Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName());
i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(i);

I’ve tried the following link to achieve the second mentioned approach

Changing locale: Force activity to reload resources?

,but it is not being raised after the following line

res.updateConfiguration(conf, dm);

Thanks in advance

How to&Answers:

I finally got the solution,in the onPause method I save the currently saved language in the sharedprefs and after changing the locale in the setting activity and returning to the previous activity in the onResume method I compare the newly saved lang with the value kept in the onPause,and if these two are not equal I call recreate method.

@Override
protected void onResume()
{
    super.onResume();

    SharedPreferences _sPreferences = getSharedPreferences(PrefConfigNames.LANGUAGE_APP_CONFIG,
            Context.MODE_PRIVATE);
    String resumeLang = _sPreferences.getString(GeneralPrefKeyNames.LANGUAGE, "En");
    if (!currentLang.equals(resumeLang))
        recreate();



};

@Override
protected void onPause()
{

    SharedPreferences _sPreferences = getSharedPreferences(PrefConfigNames.LANGUAGE_APP_CONFIG,
            Context.MODE_PRIVATE);
    currentLang = _sPreferences.getString(GeneralPrefKeyNames.LANGUAGE, "En");
    super.onPause();
};

Answer:

You should commit() the values