13

我在 Android Studio 中有一个项目,它对不同的颜色使用不同的风格(还有一些其他的东西,但它们并不重要)。

我想看看某个 UI 元素(全部由 xml 文件定义)看起来如何具有非默认风格?

假设我必须选择风味,风味 A 是默认的,风味 B 不是。假设风味 A 的主色是红色,风味 B 的主色是绿色。

当我打开布局时,无论选择构建变体中的哪种风格,它们都将始终显示为红色。

我确定有办法做到这一点,但我不知道如何。

Edit1:似乎我没有解释它(认为它是隐含的)。我的风味资源文件已经在不同的文件夹中。资源文件中的颜色同名。这不是问题,问题是我在 Android Studio 内部的布局中看不到颜色。

颜色位于单独的文件夹中,并且可以正常工作。当我构建和安装口味时,它们会使用它们的颜色。但是当我打开一个布局时,它总是在 Android Studio 中以默认颜色显示

4

3 回答 3

12

让我先吹一些灰尘:

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

这里发生的情况是,当您创建特定风味的构建(比如说flavorA)时,包装系统会获取从默认文件夹复制的特定于该风味的文件,并将其替换为您提供特定于风味的构建

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

这就是为什么一切都很完美。


现在回到重点:(Hack)

您应该怎么做才能看到具有特定风味颜色的布局?

“虽然我不推荐这种方式”,除非您对特定风味的构建有不同的布局逻辑,您所能做的就是将特定的布局文件(只是为了查看呈现的输出)放在您的风味目录下的布局文件夹中。

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

注意:同样,这只是一种以特定方式查看不同事物的 hacky 方式,而不是解决方案。即使我认为这个问题甚至没有解决方案,因为这不是问题,这就是多风格 gradle 构建系统的工作方式,这不是这个系统中的错误

编辑:


因此,经过一些研究,我发现了如何实现“根据风味颜色获得渲染输出”的方法。

假设您根据自己的口味有不同的颜色,如下所示:

在此处输入图像描述

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

风味 B包含:

颜色.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>

风味W包含:

颜色.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;博士

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

查看我的项目的主目录:

在此处输入图像描述

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

因此,如果您尝试更改构建变体并查看 main 中的任何布局文件,它将为您选择特定的产品风味颜色。

注意:请注意,如果您从一种风味中添加或删除一种颜色,请记住也要将其添加/删除到其他风味中,否则您的项目在构建时可能会出错。(您也可以对其他资源执行相同的技巧,例如可绘制对象、布局、尺寸等。只要确保每个风味都包含具有相同资源名称的所有内容)

于 2019-05-25T06:09:47.667 回答
4

我不确定它是否可能会影响带有风味的布局预览,但它绝对可能与主题有关,所以让我建议一个解决方法。

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在您的布局中使用。

于 2019-05-25T09:57:41.667 回答
0

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

于 2019-05-22T11:40:38.603 回答