当前位置: 首页 > 知识库问答 >
问题:

通过重新配置强制Android flavor的区域设置

袁耀
2023-03-14

我正在尝试使用Android构建系统中的重新配置和重新配置。

  • Android Studio 1.2.2版

我在我的项目中遇到了这两个选项的问题,所以我用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

谢啦

共有2个答案

戚逸清
2023-03-14

重新配置不会覆盖默认配置的指定重新配置,而只是将它们组合在一起。因此,您将获得包含en和fr资源的所有口味。

因此,为了避免这种情况,您不应该在默认配置中指定任何重新配置,而只需将其设置为特定的风格。

此外,该应用程序将始终包含默认值,这意味着如果您在那里有英文字符串,则在设置为任何非法语区域设置的设备上,英文内容仍会显示fr风格。

都博裕
2023-03-14

几个小时后,对于那些最终有同样问题的人来说,这是我问题的解决方案。

事实证明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的区域设置?