我的目标是更改应用程序的语言。
我可以通过对我的应用程序类以及BaseActivity进行“ attachBaseContext”来实现此目的,并将BaseActivity扩展到所有其他Activity类。
应用程序类
public class Startup extends Application{
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(LocaleManager.setLocale(base));
}
@Override
public void onConfigurationChanged(android.content.res.Configuration newConfig) {
super.onConfigurationChanged(newConfig);
LocaleManager.setLocale(this);
}
}
BaseActivity类
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void attachBaseContext(Context base){
super.attachBaseContext(LocaleManager.setLocale(base));
}
LocaleManager类
public class LocaleManager {
public static Context setLocale(Context mContext) {
return updateResources(mContext, getLanguagePref(mContext));
}
/**
* Set new Locale with context
*/
public static Context setNewLocale(Context mContext, @LocaleDef String language) {
setLanguagePref(mContext, language);
return updateResources(mContext, language);
}
public static String getLanguagePref(Context mContext) {
SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
return mPreferences.getString(LANGUAGE_KEY, ENGLISH);
}
/**
* set pref key
*/
private static void setLanguagePref(Context mContext, String localeKey) {
SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
mPreferences.edit().putString(LANGUAGE_KEY, localeKey).apply();
}
/**
* update resource
*/
private static Context updateResources(Context context, String language) {
Locale locale = new Locale(language);
Locale.setDefault(locale);
Resources res = context.getResources();
Configuration config = new Configuration(res.getConfiguration());
if (Build.VERSION.SDK_INT >= 17) {
config.setLocale(locale);
context = context.createConfigurationContext(config);
} else {
config.locale = locale;
res.updateConfiguration(config, res.getDisplayMetrics());
}
return context;
}
}
我可以通过在我的Fragment SetNewLocale(context,“ fr-french”);中使用来更改UI中应用程序的语言。
虽然我想向用户显示对话框!使用ShowDialog.class(请参阅下文)。 上下文没有变化,它仍然为我提供了默认语言为“英语”的字符串,而我没有更改语言环境。但是,如果我手动重新启动应用程序,则字符串会更改!
ShowDialog
public void showDialog(String messageHeader, final String messageBody) { // R.string.x = Hello
mBuilder = new AlertDialog.Builder(this);
mBuilder.setMessage(messageBody)
.setCancelable(false)
.setTitle(messageHeader);
mBuilder.setPositiveButton(mContext.getString(R.string.btnOfflineOK), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
});
mAlertDialog = mBuilder.create();
mAlertDialog.show();
}
MainActivity.Class
showDialog(mContext.getString(R.string.Hello),mContext.getstring(R.string.NotAvailable);
我一直在尝试了解为什么上下文没有刷新!请帮助我找到解决方案!