Android利用Gradle多渠道打包如何动态替换资源,文字

  1. 动态替换APP logo
  2. 动态替换文字

首先我们在app的build.gradle下面加入如下代码,以oem1为示例,

productFlavors {
        oem1 {
            manifestPlaceholders = [
                    oemIcon : "@drawable/oem1",
            ]
        }
}

以上代码 manifestPlaceholders 主要是用于在AndroidManifest.xml内可以动态的替换oem图标,我们看AndroidManifest.xml里面是如何用到这oemIcon的

<application
        android:allowBackup="true"
        android:icon="${oemIcon}"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

以上代码主要是关注android:icon="${oemIcon}" ,这个其实在gradle打包后悔自动替换成我们在build.gradle里面设置的‘@drawable/oem1’,这样就可以根据不同渠道包替换成不同的icon

动态替换文字

首先在build.gradle里面配置我们需要的文字

productFlavors {
        oem1 {
            resValue("string","dynamic_text","oem1的动态文字")
            manifestPlaceholders = [
                    oemIcon : "@drawable/oem1",
            ]
        }
}

注意:我们的string.xml里面不允许有dynamic_text字段,有的话编译会报错.

主要是resValue一行我们详细解释一下,
string表示的是我们要生成一个string字段,
dynamic_text指的是字段名称便于我们程序里面使用,
"oem1的动态文字"指的是我们的字符串的值

其实这一句想相当于我们在string.xml里面定义如下一行

<string name="dynamic_text">oem1的动态文字</string>

##动态替换资源文件
如果在程序中我们有一个地方需要根据不同的渠道对应不同的drawable,我们就可以用下列方法,下列方法是假设程序中有一处需要设置图片,思路是我们首先在gradle里面设置好值,在AndroidManifest.xml里面使用META_DATA,然后再从程序里面调用

build.gradle如下

 productFlavors {
        oem1 {
            manifestPlaceholders = [
                    oemIcon : "@drawable/oem1",
            ]
        }
 }

AndroidManifest.xml如下

<meta-data
            android:name="OEM_LOGO"
            android:resource="${oemIcon}"
            />

java程序如下
MainActivity.java


img.setImageResource(Util.getMetaDataInt(this,"OEM_LOGO"));

Util.java

public class Util {

    public static int getMetaDataInt(Context context,String name) {
        try {
            ApplicationInfo appInfo = context.getApplicationContext().getPackageManager()
                    .getApplicationInfo(context.getApplicationContext().getPackageName(),
                            PackageManager.GET_META_DATA);
            int logo = appInfo.metaData.getInt(name);
            return logo;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return -1;
    }

}

主要思路就是利用META_DATA来货渠道资源的int值并且返回到程序中,达到动态生成的目的

源码地址,点击进入


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com

文章标题:Android利用Gradle多渠道打包如何动态替换资源,文字

文章字数:526

本文作者:MartinHan

发布时间:2017-03-04, 12:37:00

最后更新:2020-03-31, 10:59:37

原始链接:http://cpphello.com/2017-03-04/Android%E5%88%A9%E7%94%A8Gradle%E5%A4%9A%E6%B8%A0%E9%81%93%E6%89%93%E5%8C%85%E5%A6%82%E4%BD%95%E5%8A%A8%E6%80%81%E6%9B%BF%E6%8D%A2%E8%B5%84%E6%BA%90%EF%BC%8C%E6%96%87%E5%AD%97.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏

github