Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SharedPrefs is resetting after Setting Locale of the Android Application

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

like image 687
Developer Account Avatar asked Dec 14 '15 09:12

Developer Account


1 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();
};
like image 200
Developer Account Avatar answered Nov 13 '22 11:11

Developer Account