It's simpler to use the standard approach that relies on the locale set outside the app. But there are good reasons for wanting to switch locales within the app, such as if you were writing a kiosk app that may be used by more than one person.
You can still leverage the built-in resource selection by overriding the locale for the current configuration. But as you've discovered, the locale keeps getting reset to the device default. I've found that if you launch another activity, it inherits the locale of the activity that started it. But if that activity is later recreated, such as on an orientation change, it is recreated with the device's default locale. To maintain your preferred locale, do this in the onCreate(...)
of every activity, before calling setContentView(...)
:
Resources res = getBaseContext().getResources();
Configuration config = res.getConfiguration();
Locale locale = new Locale("es", "US"); // get preferred locale from shared preferences or something
config.locale = locale; // config.setLocale(...) requires API 17
res.updateConfiguration(config, res.getDisplayMetrics());