Android 中英文切换及遇到的问题
背景:近期由于项目上的需求接受到了一个中英文切换需求。只需要在切换中英系统语言的时候改变app的名称为中文或英文就可以。关于如何实现这些可以参考如下文章:
实现中英文切换的方法:
Android app切换语言、国际化的纠缠: https://blog.csdn.net/qq_36255612/article/details/79651021
android开发中英文切换:https://blog.csdn.net/sinat_25001099/article/details/50663265
Android 7.0以上版本,如何实现应用内语言切换:https://www.jianshu.com/p/32ff13db1f0d
遇到的问题:
在已经添加了相应英文资源的状况下,测试发现。切换至英文语言后app的名称还是没有改变,打开apk文件后发现,如下图:
通过分析发现应该是gradle打包apk的时候没有将相应的资源打包进来,查看gradle配置文件发现。
defaultConfig {
applicationId "com.****"
minSdkVersion and.minSdkVersion
targetSdkVersion and.targetSdkVersion
versionCode and.versionCode
versionName and.versionName
multiDexEnabled true
vectorDrawables.useSupportLibrary = true
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName: project.getName()]
}
}
ndk {
abiFilters 'armeabi', 'x86'
}
resConfigs "zh"
}
将其修改为 resConfigs “zh”,“en-rUS”
再次打包发现依然没有对应的英文资源。
再次排查项目配置发现,在渠道的配置文件中找到:
def doFlavor(NamedDomainObjectContainerproductFlavors, Object it, String channel, boolean isSetFlavor) {
//创建渠道
ProductFlavor flavor = productFlavors.create(channel)
//lib中不能设置ApplicationId
if (isSetFlavor) {
//设置ApplicationId(包名)
String applicationId = it.applicationId
if (applicationId != null && applicationId.trim().length() > 0) {
flavor.applicationId = applicationId
}
//设置ApplicationId后缀,
String idSuffix = it.applicationidSuffix
if (idSuffix != null && idSuffix.trim().length() > 0) {
flavor.applicationIdSuffix = idSuffix
}
}
def list
if (it.abiFilters == null) {
list = new ArrayList(1)
list.add("armeabi")
} else {
def ABIs = it.abiFilters.split(",")
if (ABIs != null && ABIs.length > 0) {
list = Arrays.asList(ABIs)// new ArrayList(2)
} else {
list = new ArrayList(1)
list.add("armeabi")
}
}
// 特定渠道配置需要加入的Abi 例如armeabi,armeabi-v7a,arm64-v8a,x86,x86_64,mips,mips64
flavor.ndk.setAbiFilters(list)
println("doFlavor-------->abi = " + list)
flavor.dimension = it.dimension
//设置小版本号
String versionSuffix = it.minorVersion
if (versionSuffix != null && versionSuffix.trim().length() > 0) {
flavor.versionNameSuffix = versionSuffix
}
//设置自定义BuildConfig属性
def fields = getConfigFields(it.buildConfigFields)
if (fields != null) {
flavor.addBuildConfigFields(fields)
}
//清单文件配置
flavor.manifestPlaceholders = it.manifestPlaceholders
//剔除不需要资源---------------此处只保留了配置过的资源
def res = it.resConfig
if (res != null && res.size() > 0) {
flavor.resConfigs(res)
}
//渠道分辨率
def density = it.density
if (density != null) {
GenerateValueFilesPlugin.generateDensity(channel, density)
}
}
最后通过在渠道配置的文件中添加了resConfig,如下图:
再次打包后的结果:如下
总结:出现资源打不进去的情况极有可能就Gradle中的配置原因。需要仔细查看Gradle配置文件中是否忽略某些资源。