我正在尝试使用Android构建系统中的重新配置和重新配置。
我在我的项目中遇到了这两个选项的问题,所以我用android studio启动了一个新的空白项目。我附加了我的版本。gradle,我只在下面添加了重新配置“en”,“fr”
android {
defaultConfig {
...
resConfigs "en", "fr"
...
}
}
定义了2种基本口味
productFlavors {
fr {
resConfig "fr"
}
en {
resConfig "en"
}
}
然后我创建了2个字符串。xml文件并翻译了hello\u world默认标签
/src/main/res/values/strings。xml(默认值)
/src/main/res/values-en/string。xml/src/main/res/values-fr/strings。xml
有了这个,我希望在我的应用程序/应用程序/构建/中间/res/en/调试中只看到3个值文件夹,因为我在resConfigs中定义只使用“en”和“fr”并过滤其他任何内容
/值//br>/值en//br>/值fr/
尽管如此,所有语言值文件夹仍在其中,因此重新配置显然没有过滤任何内容。
在运行enDebug flavor variant时,我还希望从values en中看到标签hello\u world,因为我指定flavor en将使用重新配置“en”,尽管在运行测试应用程序时,我从/values fr/strings中看到标签。xml而不是/字符串中的/值。xml,因为平板电脑上的语言配置为法语加拿大
我是否误解了重新配置背后的目的?如果是这样的话,我该如何强制一种风格只在唯一的语言中运行,而不依赖于操作系统的区域设置?这个解决方案也必须与flavorDimensions兼容,因为我在试图配置的实际应用程序中使用了它们。
注意:我还提出了一个错误,因为我认为这种重新配置行为确实存在问题https://code.google.com/p/android/issues/detail?id=180694
谢啦
重新配置不会覆盖默认配置的指定重新配置,而只是将它们组合在一起。因此,您将获得包含en和fr资源的所有口味。
因此,为了避免这种情况,您不应该在默认配置中指定任何重新配置,而只需将其设置为特定的风格。
此外,该应用程序将始终包含默认值,这意味着如果您在那里有英文字符串,则在设置为任何非法语区域设置的设备上,英文内容仍会显示fr风格。
几个小时后,对于那些最终有同样问题的人来说,这是我问题的解决方案。
事实证明resConfig并不适合我所想的。我发现强制语言环境具有特定风味的正确且唯一的方法如下所示:
首先,确保您的所有活动都扩展了一个公共活动,该活动将负责强制区域设置。(我必须创建2,因为我有一些扩展FragmentActivity的活动和一些扩展活动。我也不太喜欢在activities构造函数中这样做,但因为我必须在对getResources进行任何调用之前调用applyOverrideConfiguration,我需要在活动的onStart之前调用它)。
public class LocaleMainActivity extends Activity {
public LocaleMainActivity() {
ActivityUtils.forceLocale(this);
}
}
public class LocaleMainFragmentActivity extends FragmentActivity {
public LocaleMainFragmentActivity() {
ActivityUtils.forceLocale(this);
}
}
//Method from ActivityUtils
public static void forceLocale(ContextThemeWrapper contextThemeWrapper) {
Configuration configuration = new Configuration();
Locale defaultLocale = new Locale(BuildConfig.LOCALE);
configuration.locale = defaultLocale;
contextThemeWrapper.applyOverrideConfiguration(configuration);
}
接下来,您需要在build.gradle风格中定义语言环境
productFlavors {
myFrenchFlavor {
buildConfigField "String", "LOCALE", "\"fr\""
}
myEnglishFlavor {
buildConfigField "String", "LOCALE", "\"en\""
}
}
我在API 19上测试了该解决方案。在应用程序中更改语言时也可以使用。
替代解决方案(在Android M上不起作用,请参阅android错误报告)此解决方案在stackOverflow上广泛传播,但我在Android M上实现此解决方案时遇到了障碍,因此请记住这一点。
在Android应用程序的onCreate()中,您可以使用语言环境集调用updateConfiguration。
Locale myLocale = new Locale(BuildConfig.LOCALE);
Resources res = getResources();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
res.updateConfiguration(conf, res.getDisplayMetrics());
如果定义了onConfigurationChanged(),则还需要重置它
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Configuration config = new Configuration(newConfig);
config.locale = new Locale(BuildConfig.LOCALE);
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
}
编辑:请注意,此应用程序覆盖配置目前有一个副作用,这里解释Chromiumhtml" target="_blank">webview似乎不适用于Android应用程序覆盖配置。Chromium团队目前正在努力!
谢谢
我想强制我的Symfony 2.5应用程序的区域设置为。我希望这个区域设置用于strftime()函数。 我的: 我正在我的一个控制器中使用以下代码来调试: 当这样执行时,它显示:。 但是,当第一行未注释时,它会显示:,因此区域设置已安装在系统中并正常工作。 我如何使Symfony始终使用配置中指定的语言环境? $locale-a:
我创建了一个控制器,根据加密的GET参数手动设置安全令牌。我使用它来创建一个远程登录URL,当用户遵循此链接时,该URL将执行登录。 现在我想添加区域设置。当提供了朗参数时,它应该设置区域设置。我添加了这个到我的控制器: 正在根据开发栏将_locale变量设置到设置中。但是,未加载语言文件,它将返回默认语言。 我读过关于创建监听器来实现这一点的文章,但是在我看来,当你想在网址中提供语言时,这是有用
当我输入时,它显示: 系统是centos7:如何解决该问题? 的内容。巴什尔 以及简介的内容 我还尝试安装postgresql,当我登录时,它显示如下。
问题内容: 是否可以使用Tire更新elasticsearch设置?我有这个curl命令,我想自动运行。 该值可通过轮胎获得,但我不确定如何应用。 问题答案: 可能,但是很丑:) 在将来的版本中会变得更好…
当我修改文件时,它会在启动后加载配置文件,否则不会重新加载文件。我的IDE是。 我的问题:
我正在开发一个应用程序,我显式地将应用程序的语言环境设置为阿拉伯语。然而,我想收集英语的电话号码。我如何才能将EditText和TextView的语言环境显式地设置为美国英语。 下面是我如何设置应用程序区域设置的。我有一门助手课 在我的活动中,我在中使用这个助手,如下所示: 如何分别为我们设置EditText或TextView的区域设置?