在Android Studio中根据Flavor显示布局

15
我在Android Studio中有一个项目,使用不同的flavor来表示不同的颜色(还有其他一些东西,但这不重要)。
我想知道某个UI元素(都由xml文件定义)在非默认flavor下的外观是什么样子?
假设我有两个flavors,flavor A是默认的,flavor B不是。 假设flavor A的主色是红色,而flavor B的主色是绿色。
当我打开布局时,无论选择构建变体中的哪种flavor,它们始终显示为红色。
我确信有方法可以解决这个问题,但我不知道该怎么做。
编辑1:似乎我没有解释清楚(认为这是隐含的)。我的flavor资源文件已经在不同的文件夹中了。资源文件中的颜色名称相同。这不是问题,问题是我在Android Studio中看不到布局中的颜色。
颜色在单独的文件夹中,它按照预期工作。 当我构建并安装flavors时,它们使用自己的颜色。 但是当我打开布局时,它总是以默认颜色显示在Android Studio中。

为每种风味使用单独的颜色文件,并且资源的名称应该相同。 - Rajasekaran M
我已经编辑了问题,以更好地解释我的问题。我已经为每种风味使用了单独的颜色文件。 - Invader Zim
主文件中是否有任何颜色资源文件? - Moinkhan
3个回答

14

先让我先打扫一些灰尘:

您在布局文件中获取默认颜色是因为,您的布局位于默认文件夹下(在这种情况下为主包)

这里发生的情况是,当您创建特定风味的构建(比如 flavorA)时,打包系统会拿取特定于那个风味的文件,这些文件从默认文件夹复制并替换,以提供特定于风味的构建

因此,您生成的 apk 文件包含特定于风味的文件(在这种情况下为 colors.xml)+主要的默认文件(来自主要的 res 文件夹,例如所有布局和其他资源以及您的类文件),这些不是您特定于风味的文件夹的一部分。

这就是为什么一切都能完美工作的原因。


现在回到重点:(黑客)

您应该怎么做才能看到有风味的颜色呢?

"虽然我不建议这种方式",除非您对特定于风味的构建具有不同的布局逻辑,否则您所能做的就是将特定的布局文件 (仅为了查看渲染输出) 放置在flavorA目录下的layout文件夹中。

因此,它现在将从flavorA文件夹中获取颜色,并使用该颜色在您的布局文件中在IDE中呈现您的布局。

注意:再次说明,这只是一种以特定于风味的方式查看不同事物的hacky方法,而不是解决方案。即使我认为没有解决这个问题的方法,因为这不是问题,这是多风味 gradle 构建系统的工作方式,这不是该系统中的错误

编辑:


因此,在调研后,我找到了如何实现 '根据您的风味颜色获得呈现输出' 的方法。

假设您基于风味拥有不同的颜色,如下所示 :

enter image description here

现在,flavorBflavorW的内容是不同的,但colors.xml文件具有相同的颜色属性,如下所示:

flavorB 包含 :

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#757575</color>
    <color name="colorPrimaryDark">#212121</color>
    <color name="colorAccent">#607d8b</color>
</resources>

flavorW包含:

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#6d4c41</color>
    <color name="colorPrimaryDark">#3e2723</color>
    <color name="colorAccent">#33691e</color>
</resources>

您可以发现颜色元素的数量相同,只是值不同。

TL;DR

解决方案:在这种情况下,您可以从 main/res/values 文件夹中简单地删除 colors.xml 。除非您缺少特定于“当前构建变体”的flavor属性颜色,否则不会生成任何错误。

查看我的项目的 main 目录:

enter image description here

(如您所见,主资源目录不包含任何 colors.xml 文件)

因此,如果您尝试更改您的构建变体并查看来自主要的任何 layout 文件,它将为您选择特定于产品风味的颜色。

注意:请注意,如果您从一个flavor添加或删除一个颜色,请确保也将其添加/删除到其他flavor中,否则在构建时可能会出现错误。 (您也可以使用其他资源执行相同的技巧,例如绘图,布局,尺寸等,只需确保每个flavor都包含具有相同资源名称的所有内容)


谢谢,我自己也想到了这样的东西,但是希望 Android Studio 能够在不进行任何修改的情况下为我解决它。我接受你的答案,因为我会做类似的事情:默认将用于测试,而口味将用于最终构建。因此,如果我想测试 flavorA,我将把 flavorA 资源放到默认位置,如果我想要 flavorB,我就放 flavorB。 - Invader Zim
不要那样做,只需从主文件中删除colors.xml,然后按照我在编辑之后建议的方式将其放入所有风味中,它会像您想要的那样完美运行。 - Jeel Vankhede

4

我不确定是否可以通过flavours来影响布局预览,但是用主题是肯定可以的,所以让我提供一个解决办法。

1)在您的主要源集中创建两个主题:

    <style name="MyStyle">
        <item name="colorPrimary">#44f</item>
    </style>

    <style name="MyStyle.Red">
        <item name="colorPrimary">#f44</item>
    </style>

这基本上足够定制布局预览:您可以选择所需的主题。

2)为了使您的布局与风格相关,请创建一个主题,该主题将根据风味继承MyStyleMyStyle.Red

在主要源集中:

<style name="MyFlavorDependentStyle" parent="MyStyle"/>

在口味源集中:
<style name="MyFlavorDependentStyle" parent="MyStyle.Red"/>

在您的布局中使用MyFlavorDependentStyle


说实话,如果我没有很多样式的话,这将是一个很好的解决方案,但它会让我更加困惑而不是帮助。无论如何,非常感谢您的建议。 - Invader Zim

0
如果颜色是在 XML 中定义的,只需将颜色定义从 main/colors.xml 移动到 flavorA/colors.xmlflavorB/colors.xml

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接