【问题标题】:Dynamic font typeface with gradle带有 gradle 的动态字体字体
【发布时间】:2015-05-29 19:51:15
【问题描述】:

有什么方法可以在我的 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 类中,我将他的字体设置为:

setTypeface(mFontFileName);

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

【问题讨论】:

    标签: android gradle android-typeface


    【解决方案1】:

    有什么方法可以在 build.gradle 中声明变量(使用产品风格),可以在我的 Android 应用程序的 styles.xml 中替换?

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

    【讨论】:

    • 谢谢伙计!你让我开心!
    • 如何让字符串值具有常规、中等、粗体等字体的名称?它会比你的方法更有效吗?
    【解决方案2】:

    就像你想做的那样,按照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

    好吗?现在我们知道编译器将如何为您使用不同的文件/文件夹 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)
    

    仅此而已……哈哈哈……如果它有效,请投票给我……祝你编码愉快!

    【讨论】:

      猜你喜欢
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多