安装我的应用程序后,首次运行时会要求用户选择语言;但是如果用户第二次启动应用程序,则会自动设置语言(以前选择的语言)。
问题是,在用户选择语言的第一次运行时,app仍然是英文(无论用户选择何种语言),但如果我旋转设备,则语言被更改为正确的(到选定的一个)。应用程序第二次运行时出现同样的问应用程序以英语启动,但在轮换语言更改为正确之后。
有什么建议吗?提前谢谢你
这里是我更改语言的MainActivity代码:
let renderCommandEncoder = renderer.currentRenderCommandEncoder!
renderCommandEncoder.setVertexBuffer(buffer2, offset: 0, atIndex: 2)
renderCommandEncoder.endEncoding()
这里是来自设置的代码片段:
private void initApp() {
if (Settings.getLanguage().equals("")){
String[] items = { getResources().getString(R.string.lang_eng), getResources().getString(R.string.lang_geo)};
showDialogSingleChoise(items, getResources().getString(R.string.select_language_title), 0, false, false, this.languageSelectedListener, this.languageConfirmedListener, null);
} else {
System.out.println("initApp: " + Settings.getLanguage());
Settings.setLanguage(MainActivity.this.getResources(), Settings.getLanguage());
appVersionCheck();
}
}
private OnClickListener languageConfirmedListener = new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Settings.setLanguage(MainActivity.this.getResources(), MainActivity.this.language);
appVersionCheck();
}
};
这是我的Application类:
public static void setLanguage(Resources res, String langString){
System.out.println("lang in pref: " + langString);
setStringProperty(PREFS_LANG ,langString);
MainApp.getInstance().setLocale(res);
}
最后,这是显而易见的(我需要android:configChanges =" locale"根本吗?):
public class MainApp extends Application {
private static volatile MainApp instance;
public static MainApp getInstance() {
return MainApp.instance;
}
@Override
public void onCreate() {
MainApp.instance = this;
super.onCreate();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setLocale(this.getResources());
}
public void setLocale(Resources res) {
System.out.println("initApp: " + Settings.getLanguage() == "" ? Settings.LANG_EN : Settings.getLanguage());
Configuration conf = res.getConfiguration();
conf.locale = new Locale(Settings.getLanguage() == "" ? Settings.LANG_EN : Settings.getLanguage());
res.updateConfiguration(conf, res.getDisplayMetrics());
}
}
答案 0 :(得分:3)
在活动 重新启动之前,您的配置无法应用,因此当您点击更改区域设置时,无法立即应用,但是当您旋转屏幕时因此重新启动会应用您的配置更改。
您应该在单击以更改区域设置后手动重新启动活动,这是一个重新启动活动的代码演示:
private void restartActivity() {
Intent intent = getIntent();
finish();
startActivity(intent);
}
我认为您不应该在应用程序类中编写更改的区域设置代码,它应该写在您用来更改区域设置的Activity中。
至于在将来的应用程序开放中应用新的语言环境,您可以使用SharedPreferences
保存配置,并在每次打开应用程序时获取语言环境值并将其应用。
您可以获取SharedPreferences
并在应用程序类的 onCreate()
方法中应用区域设置。
你当然应该在你的清单中写android:configChanges="locale|orientation"
并且onConfigurationChanged()
方法也是必要的。因为如果你旋转屏幕或做任何改变可以重启你的Activity的系统配置的事情,将应用默认语言环境。因此,每次更改配置时都应确保应用新语言环境。
有关如何处理区域设置更改的更多详细信息,请参阅:How to refresh activity after changing language (Locale) inside application
答案 1 :(得分:1)
我在应用中覆盖我的ConfigChange
,如下所示,我每次configurationChanged
调用setLocale函数:
public class AioApplication extends Application {
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setLocale(LocaleUtility.getLocale());
}
@Override
public void onCreate() {
super.onCreate();
LocaleUtility.initialize(this);
}
private void setLocale(Locale locale) {
Configuration conf = getBaseContext().getResources().getConfiguration();
conf.locale = locale;
getBaseContext().getResources().updateConfiguration(conf, getResources().getDisplayMetrics());
Configuration systemConf = Resources.getSystem().getConfiguration();
systemConf.locale = locale;
Resources.getSystem().updateConfiguration(systemConf, Resources.getSystem().getDisplayMetrics());
Locale.setDefault(locale);
}
}
答案 2 :(得分:0)
您的tr
似乎更新了应用的配置。但您已要求使用setLocale
如果删除该行,则配置更改可能有效。
我认为您可以删除的一件事是您的应用程序对象中的android:configChanges="locale"
方法。这不会导致你目前无限循环吗?
更新:看起来像手动更改区域设置配置不会导致活动重新启动。看看这个:Changing Locale within the app itself
虽然如果可以的话,我会非常小心使用onConfigurationChange