在“onResume”方法之后更改区域设置不起作用?
Changing locale not working after `onResume` method?
我有一个(或多或少)翻译成其他语言的应用程序。为此,我使用了 locale
,为了保存用户首选的语言,我使用了 SharedPreferences
.
使用它,我设法在应用程序内的 any/every activity 上加载了首选语言。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pick);
findViewById(R.id.flagcollection).setVisibility(View.GONE);
findViewById(R.id.worldmapswitch)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (flagWorld) {
// means true
findViewById(R.id.flagcollection).setVisibility(View.GONE);
flagWorld = false;
} else {
findViewById(R.id.flagcollection).setVisibility(View.VISIBLE);
flagWorld = true;
}
}
});
preferences = getSharedPreferences("settings_values", MODE_PRIVATE);
String SavedLocaleLang = preferences.getString("LocalLang", null);
Locale locale = new Locale(SavedLocaleLang);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getResources().updateConfiguration(config, getResources().getDisplayMetrics());
....
问题是,如果出于某种原因我离开了该应用程序(不是 exiting/ending activity),一段时间后当我 return 进入该应用程序时,它会使用 PHONE的默认语言而不是区域设置的保存值。
然后,在阅读了许多关于 onResume 奇迹的帖子后,结合我的 java 无技能,我尝试了这个:
@Override
public void onResume(){
super.onResume();
// put your code here...
preferences = getSharedPreferences("settings_values", MODE_PRIVATE);
String SavedLocaleLang = preferences.getString("LocalLang", null);
Locale locale = new Locale(SavedLocaleLang);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getResources().updateConfiguration(config, getResources().getDisplayMetrics());
}
我以为我已经解决了我的问题,但在不到 1 小时的测试结果后我意识到我什么也没做(至少没有做任何好事)。我哪里做错了。
如果有人有能力、有耐心和善意,请帮助我了解我做错了什么以及哪里做错了。
任何帮助将不胜感激!请不要讽刺。在那里我做得很好 :P
谢谢!!!
P.S。用户 "Cochi" 请求了用于在 Prefereces 中保存语言环境的代码...所以你去吧:
findViewById(R.id.flaghungary)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String localeHU = "hu";
SharedPreferences settings = getSharedPreferences("settings_values", MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putString("LocalLang", localeHU);
editor.apply();
Locale locale = new Locale("hu");
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getResources().updateConfiguration(config, getResources().getDisplayMetrics());
setContentView(R.layout.activity_pick);
Context context = getApplicationContext();
Toast.makeText(context, "Magyar nyelv kiválasztva", Toast.LENGTH_SHORT).show();
recreate();
}
});
尝试将该代码放在 onCreate
中,在 setContentView
:
之前
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
String SavedLocaleLang = preferences.getString("LocalLang", null);
Locale locale = new Locale(SavedLocaleLang);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getResources().updateConfiguration(config, getResources().getDisplayMetrics());
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
我有一个(或多或少)翻译成其他语言的应用程序。为此,我使用了 locale
,为了保存用户首选的语言,我使用了 SharedPreferences
.
使用它,我设法在应用程序内的 any/every activity 上加载了首选语言。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pick);
findViewById(R.id.flagcollection).setVisibility(View.GONE);
findViewById(R.id.worldmapswitch)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (flagWorld) {
// means true
findViewById(R.id.flagcollection).setVisibility(View.GONE);
flagWorld = false;
} else {
findViewById(R.id.flagcollection).setVisibility(View.VISIBLE);
flagWorld = true;
}
}
});
preferences = getSharedPreferences("settings_values", MODE_PRIVATE);
String SavedLocaleLang = preferences.getString("LocalLang", null);
Locale locale = new Locale(SavedLocaleLang);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getResources().updateConfiguration(config, getResources().getDisplayMetrics());
....
问题是,如果出于某种原因我离开了该应用程序(不是 exiting/ending activity),一段时间后当我 return 进入该应用程序时,它会使用 PHONE的默认语言而不是区域设置的保存值。
然后,在阅读了许多关于 onResume 奇迹的帖子后,结合我的 java 无技能,我尝试了这个:
@Override
public void onResume(){
super.onResume();
// put your code here...
preferences = getSharedPreferences("settings_values", MODE_PRIVATE);
String SavedLocaleLang = preferences.getString("LocalLang", null);
Locale locale = new Locale(SavedLocaleLang);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getResources().updateConfiguration(config, getResources().getDisplayMetrics());
}
我以为我已经解决了我的问题,但在不到 1 小时的测试结果后我意识到我什么也没做(至少没有做任何好事)。我哪里做错了。
如果有人有能力、有耐心和善意,请帮助我了解我做错了什么以及哪里做错了。
任何帮助将不胜感激!请不要讽刺。在那里我做得很好 :P
谢谢!!!
P.S。用户 "Cochi" 请求了用于在 Prefereces 中保存语言环境的代码...所以你去吧:
findViewById(R.id.flaghungary)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String localeHU = "hu";
SharedPreferences settings = getSharedPreferences("settings_values", MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putString("LocalLang", localeHU);
editor.apply();
Locale locale = new Locale("hu");
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getResources().updateConfiguration(config, getResources().getDisplayMetrics());
setContentView(R.layout.activity_pick);
Context context = getApplicationContext();
Toast.makeText(context, "Magyar nyelv kiválasztva", Toast.LENGTH_SHORT).show();
recreate();
}
});
尝试将该代码放在 onCreate
中,在 setContentView
:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
String SavedLocaleLang = preferences.getString("LocalLang", null);
Locale locale = new Locale(SavedLocaleLang);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getResources().updateConfiguration(config, getResources().getDisplayMetrics());
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}