我必须实现一个应用程序原型,应该可以更改应用程序内的语言。 我的代码:
...builder.setItems(langList, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
selectedLanguage = which;
if (selectedLanguage != -1) {
Configuration configuration = new Configuration(getResources().getConfiguration());
String currentLanguage = configuration.locale.getLanguage();
switch (selectedLanguage) {
case 0:
if (currentLanguage.equalsIgnoreCase("de")) {
configuration.locale = Locale.ENGLISH;
} else {
return;
}
break;
case 1:
if (currentLanguage.equalsIgnoreCase("en")) {
configuration.locale = Locale.GERMAN;
} else {
return;
}
break;
default:
break;
}
getResources().updateConfiguration(configuration, null);
Intent intent = new Intent(getActivity(), DashboardActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
dialog.dismiss();
}...
它很好用。但问题是 - 当您更改显示模式(纵向< =>横向)时,再次加载当前系统语言(分别在 values 文件夹中 strings.xml )。 有没有人经历过它,或者可能是一个建议我怎么能解决这个问题呢?
提前感谢..
答案 0 :(得分:0)
您可以在用户选择其语言时将其保存在首选项中,并在oncreate方法中检查首选项是否具有语言值,如果不加载默认语言
默认情况下,更改方向将调用oncreate方法,因此可以随意添加检查代码
答案 1 :(得分:0)
由于onConfigurationChanged()生命周期事件发生,您可以在发生方向更改时发现问题。
有关如何检测方向更改的信息,请参阅以下示例。 http://techblogon.com/android-screen-orientation-change-rotation-example/
配置更改后,您可以存储所需的任何值。请注意,您还可以在首次设置时将值存储在设置中。
创建活动时(onCreate()),您可以阅读方向并设置任何适当的值。
总之,请查看活动生命周期,您可以触发相关事件。
答案 2 :(得分:0)
所以,我使用 SharedPreferences :
解决了这个问题... default:
break;
}
SharedPreferences preferences = getActivity().getSharedPreferences("SETTINGS_FILE", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("currentLanguage", configuration.locale.getLanguage());
editor.commit();
getResources().updateConfiguration(configuration, null); ...
然后我在MainActivity / MainFragment中实现了方法 setCurrentLanguage():
... protected void setCurrentLanguage() {
Configuration configuration = new Configuration(getResources().getConfiguration());
SharedPreferences preferences = getSharedPreferences("SETTINGS_FILE", Context.MODE_PRIVATE);
String restoredLanguage = preferences.getString("currentLanguage", null);
if (restoredLanguage.equalsIgnoreCase("en")) {
configuration.locale = Locale.ENGLISH;
getResources().updateConfiguration(configuration, null);
}
} ...
并且我在 setContentView(...)之前在每个活动/片段中调用此方法:
// in an activity
... protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setCurrentLanguage();
setContentView(R.layout.activity_dashboard); ...
// or in a fragment
... public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setCurrentLanguage();
View rootView = inflater.inflate(R.layout.fragment_preferences,
container, false); ...
再次感谢您的帮助;)