我希望我的语言动态更改,我正在尝试使用onConfigurationChanged,但它没有被调用。我有一个MainActivity,可以创建我的操作栏和viewpager。我的其余页面都是碎片。在我的SettingsFragment中,我有一个按钮可以将语言切换为法语。
langChange.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View vi) {
MainActivity main = (MainActivity)getActivity();
main.langChange();
}
});
然后在我的MainActivity中我有
@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
if (locale != null){
newConfig.locale = locale;
Locale.setDefault(locale);
getBaseContext().getResources().updateConfiguration(newConfig, getBaseContext().getResources().getDisplayMetrics());
}
}
public void langChange(){
if(currentLanguage == FRENCH_LANGUAGE){
locale = new Locale("en");
Locale.setDefault(locale);
Configuration c = getBaseContext().getResources().getConfiguration();
c.locale = locale;
getBaseContext().getResources().updateConfiguration(c,getBaseContext().getResources().getDisplayMetrics());
currentLanguage = "English";
}
else if(currentLanguage == ENGLISH_LANGUAGE){
locale = new Locale("fr");
Locale.setDefault(locale);
Configuration c = getBaseContext().getResources().getConfiguration();
c.locale = locale;
getBaseContext().getResources().updateConfiguration(c,getBaseContext().getResources().getDisplayMetrics());
currentLanguage = "French";
}
actionBar.setSelectedNavigationItem(actionBar.getTabCount() - 1); //This just puts it back to the settings tab
}
未调用onConfigurationChanged
。在我的清单中,我有:
<activity android:name="MainActivity" android:screenOrientation="portrait" android:configChanges="locale"></activity>
我尝试添加其中一个或所有选项orientation|keyboardHidden|screenSize
但没有成功。
所有这一切的原因是因为我想在单击按钮后更改actionBar文本和所有其他文本。我有一个单独的法语字符串文件。
任何帮助都会很棒。
答案 0 :(得分:7)
你必须定义android:configChanges =“layoutDirection | locale”才能调用onConfigurationChanged()。
答案 1 :(得分:4)
好的,我已经对此进行了一些调查。
我不确定,为什么onConfigurationChanged
方法没有被调用,所以我希望有人可以启发我们。
在我的搜索中,我偶然发现了tutorial,它实际上通过更改配置来更改Locale
。
你的代码实际上看起来很像这个教程; - )
无论如何,关于教程和代码的重要一点是这个方法:
private void updateTexts() {
txt_hello.setText(R.string.hello_world);
btn_en.setText(R.string.btn_en);
btn_ru.setText(R.string.btn_ru);
btn_fr.setText(R.string.btn_fr);
btn_de.setText(R.string.btn_de);
}
这就是&#34;魔术&#34;发生;在您更改了区域设置后,您需要重新加载资源,因为您告诉Android您想要自己处理某些配置,您需要通过再次设置UI项目文本来专门重新加载所有文本。
完成此操作后,应用程序将加载特定区域设置文件夹中的字符串。
Activity
的{{1}}说法可以找到Android行为方式的答案:
[...]
这样做是因为任何应用程序资源(包括布局文件)都可以根据任何配置值进行更改。因此,处理配置更改的唯一安全方法是重新检索所有资源,包括布局,drawable和字符串。由于活动必须已经知道如何保存其状态并从该状态重新创建自己,因此这是一种使用新配置重新启动活动的便捷方式。
编写教程的人非常友好地将整个教程项目添加为下载,所以我建议你去看看它是如何工作的,因为它正在工作;-)你可以取消注释onConfigurationChanged
方法,因为它似乎没有做任何事情。
希望这有帮助。