gradle 的动态字体字样

Dynamic font typeface with gradle

有什么方法可以在我的 Android 应用程序的 styles.xml 中替换 build.gradle 中声明的变量(使用产品口味)?我想为我用于应用程序的每种产品风格提供自定义字体,如下所示:

Is it possible to declare a variable in Gradle usable in Java?

并且您有一些样式取决于变量的值:

<style name="my-android-style">
    <item name="font_file_name">MY_VARIABLE_NAME-regular.ttf</item>
</style>

然后,在我的自定义 TextView class 中,我将他的字体设置为:

setTypeface(mFontFileName);

有什么办法可以解决这个问题? 提前致谢。

There is any way to declare variables (using product flavors) in the build.gradle that can be substituted in the styles.xml of my Android application?

没有。但是你可以有不同版本的 styles-fonts.xml 文件来声明你的字体。在 main 中使用默认值,并根据需要在其他产品风格中覆盖该文件。将尽可能少的样式信息隔离到 styles-fonts.xml(或任何你想命名的名称)中,你可以最大限度地减少构建变体之间的冗余。

如你所愿,按照CommonWare的回答,是不可能的。但是你可以用另一种方式做:对于我的 whitelabels 产品,我创建了一个名为 branding.xml 的文件(在 values 文件夹内),我在这个文件中设置了我在构建不同时需要注意的所有事情来自我的根项目的产品。 (你当然可以用你想要的名字来调用这个文件。这个文件也必须包含在根项目中)。

我要开始向您展示我的 gradle 文件的一小部分,好吗?

   signingConfigs {
      rootproject{
        storeFile file("rootprojec_keystore") //Path to the keystore file
        keyAlias "aliasname"
        storePassword "xxxxxxxxx"
        keyPassword "xxxxxxx"
      }

      whitelabel1 {
        storeFile file("whitelabels/whitelabel1_keystore") //Path to the keystore file
        keyAlias "whitelabel_1"
        storePassword "xxxxxxxx"
        keyPassword "xxxxxxx"
      }
  }

  productFlavors {
    rootproject{
        applicationId  = "com.rootproject.android"
        signingConfig = signingConfigs.rootproject
    }

    whitelabel1{
        applicationId  = "com.whitelaber1.android"
        signingConfig = signingConfigs.whitelabel1
    }
 }

  sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src','test']
        resources.srcDirs = ['src','test']
        aidl.srcDirs = ['src','test']
        renderscript.srcDirs = ['src','test']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
    }

    whitelabel1{
        res.srcDirs = ['whitelabels/whitelabel1/res']
    }
}

在最后一个块 (sourceSets) 中是您拥有密钥的地方。对于我的 whitelabels,我使用了一个完整的 res 文件夹,但你甚至可以只使用我认为的文件:whitelabels/whitelabel1/res/values/branding.xml

好吗?现在我们知道编译器将如何为您使用不同的 file/folder whitelabel。

那么,现在我们要描述 branding.xml 个文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="kind_font">assets/fonts/nameofthefont.ttf</integer>
</resources>

您必须在根项目和白标项目中创建相同的文件,当然要更改字体的值。

好的,在您的应用中使用自定义字体的一种优雅方式是使用自定义文本视图,因此您必须按照此处的说明进行操作,这非常简单:

http://www.techrepublic.com/article/pro-tip-extend-androids-textview-to-use-custom-fonts/

最后是您必须访问具有要加载字体名称的变量的代码行。在上一本手册中有一行:

Typeface myTypeface = Typeface.createFromAsset(getContext().getAssets(), "fonts/"+fontName);

并且您应该使用 branding.xml 文件中描述的变量名称进行修改:

String fontName = ((String)getResources().getString(R.bool.kind_font)

就这些了...哈哈哈...如果有效请给我投票...祝您编码愉快!