Android 中英文切换及遇到的问题

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文件后发现,如下图:
Android 中英文切换及遇到的问题_第1张图片

通过分析发现应该是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(NamedDomainObjectContainer productFlavors, 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,如下图:

Android 中英文切换及遇到的问题_第2张图片
再次打包后的结果:如下
Android 中英文切换及遇到的问题_第3张图片

总结:出现资源打不进去的情况极有可能就Gradle中的配置原因。需要仔细查看Gradle配置文件中是否忽略某些资源。

你可能感兴趣的:(工作中遇到的问题)