根据口味在Android Studio中显示布局

时间:2019-05-22 11:33:12

标签: android android-layout android-build-flavors

我在Android Studio中有一个项目,该项目针对不同的颜色使用不同的样式(也有其他一些东西,但没关系)。

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

比方说,我必须调味,风味A是默认的,风味B不是。假设风味A主色为红色,风味B主色为绿色。

打开布局时,无论在构建变体中选择哪种样式,它们都将始终显示为红色。

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

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

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

3 个答案:

答案 0 :(得分:8)

  

让我先吹一些灰尘:

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

这里发生的是,当您创建特定风味的版本(例如 flavorA )时,打包系统会从默认文件夹中复制特定于该风味的文件,并将其替换以提供< strong>特定于口味的版本。

因此,您生成的apk文件包含特定于口味的文件 (在您的情况下为colors.xml) + 主文件中的默认文件 (主要文件夹的res文件夹,如所有布局和其他资源,以及您的班级文件),这些都不属于您的风味特定文件夹。

这就是一切正常运行的原因。


  

现在回到点:(Hack)

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

“尽管我不推荐这种方式”,除非您针对风味特定的构建使用不同的布局逻辑,您所能做的就是将特定的布局文件(只是为了查看渲染的输出) flavorA目录下的布局文件夹

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

注意:同样,这只是一种以特定于口味的方式查看不同内容的方法,而不是解决方案。即使我认为对此问题甚至没有解决方案,因为这不是问题,这是多口味gradle构建系统的工作方式,而不是该系统中的错误

编辑:


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

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

enter image description here

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

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 。除非您为“当前的构建版本”缺少任何特定于口味的颜色属性,否则它不会产生任何错误。

检出我项目的主目录

enter image description here

(如您在此处看到的,主资源目录不包含任何 colors.xml 文件)

因此,如果您尝试更改构建版本并从主目录中查看任何布局文件,它将为您选择该特定产品口味的颜色。

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

答案 1 :(得分: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

答案 2 :(得分:0)

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