Android开发:《Gradle Recipes for Android》阅读笔记(翻译)3.4——Flavor Dimensions

问题:

一个product flavor不够,你需要另一个标准去区分不同版本的app

解决方案:

在product flavor中增加flavorDimensions

讨论:

在3.2章展示了一个有三个product flavor的app(arrogant,friendly,obsequious)。这几个flavor是基于态度区分。

然后不同的客户希望app有他们自己的烙印。代码大体上都是一样的。只有很小的一部分不一样。

为了防止大量的赋值黏贴,介绍下额外的flavor dimension。build file如下:

flavorDimensions 'attitude', 'client'
productFlavors {
    arrogant {
        dimension 'attitude'
        applicationId 'com.oreilly.helloworld.arrg'
    }
    friendly {
        dimension 'attitude'
        applicationId 'com.oreilly.helloworld.frnd'
    }
    obsequious {
        dimension 'attitude'
        applicationId 'com.oreilly.helloworld.obsq'
    }
    stark {
        dimension 'client'
    } 
wayne { dimension 'client' } }

现在有两个不同维度的flavor:attitude和client。arrogant,friendly和obsequious是基于态度的,stark和wayne是对不同的客户。

这形成更多的变体。

为了让这些变体做些可见的事情,为每个客户 flavor新增目录结构,如下:

stark客户stark/res/values目录下的colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <color name="text_color">#beba46</color> 
  <color name="background_color">#771414</color> </resources>

wayne/res/values目录下的colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="text_color">#beba46</color>
    <color name="background_color">#771414</color> 
</resources>

不同客户下的string.xml就改变hello_world字符串:

<resources>
  <string name="hello_world">Stark Industries</string>
</resources>
<resources>
    <string name="hello_world">Wayne Enterprises</string>
</resources>

acitivity_main.xml里面的TextView被修改使用心得colors和strings。

<TextView
android:id="@+id/name_text_view" 
android:layout_width
="match_parent"
android:layout_height
="wrap_content"
android:textColor
="@color/text_color"
android:background
="@color/background_color"
android:textSize
="32sp"
android:text
="@string/hello_world" />

效果如下图:

有一个需要注意的地方。flavorDimension标签中将attitude放在client前面,以为这attitude里面的值比client里面的优先级高。因此将hello_world字符串从每个attitude flavor中去除。交换client和attitude的顺序也是这样工作。

posted @ 2017-02-14 22:36  tootwo2  阅读(3477)  评论(0编辑  收藏  举报