我在Android Studio中有一个项目,该项目针对不同的颜色使用不同的样式(也有其他一些东西,但没关系)。
我想看看某个UI元素(均由xml文件定义)如何具有非默认风格?
比方说,我必须调味,风味A是默认的,风味B不是。假设风味A主色为红色,风味B主色为绿色。
打开布局时,无论在构建变体中选择哪种样式,它们都将始终显示为红色。
我确定有办法做到这一点,但我不知道怎么做。
Edit1:似乎我没有解释它(认为它是隐式的)。 我的口味资源文件已经在不同的文件夹中。资源文件中的颜色具有相同的名称。那不是问题,问题是我看不到Android Studio内部布局中的颜色。
颜色在单独的文件夹中,它可以正常工作。当我构建和安装调味剂时,它们会使用它们的颜色。但是当我打开布局时,它总是在Android Studio中以默认颜色显示
答案 0 :(得分:8)
让我先吹一些灰尘:
您在布局文件中获得默认颜色的原因是,您的布局位于默认文件夹(在这种情况下为主包)下。
这里发生的是,当您创建特定风味的版本(例如 flavorA )时,打包系统会从默认文件夹中复制特定于该风味的文件,并将其替换以提供< strong>特定于口味的版本。
因此,您生成的apk文件包含特定于口味的文件 (在您的情况下为colors.xml) + 主文件中的默认文件 (主要文件夹的res文件夹,如所有布局和其他资源,以及您的班级文件),这些都不属于您的风味特定文件夹。
这就是一切正常运行的原因。
现在回到点:(Hack)
您应该怎么做才能看到具有特定风味的颜色的布局?
“尽管我不推荐这种方式”,除非您针对风味特定的构建使用不同的布局逻辑,您所能做的就是将特定的布局文件(只是为了查看渲染的输出) flavorA目录下的布局文件夹。
因此,现在它将从 flavorA 文件夹中获取颜色,并在 IDE 中将您的布局呈现为您的布局文件中的颜色。
注意:同样,这只是一种以特定于口味的方式查看不同内容的方法,而不是解决方案。即使我认为对此问题甚至没有解决方案,因为这不是问题,这是多口味gradle构建系统的工作方式,而不是该系统中的错误。
编辑:
因此,经过一些研究,我发现如何实现“根据风味颜色获得渲染输出”这样的东西。
假设您根据自己的口味使用不同的颜色,如下所示:
现在, 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>
您会发现颜色元素的数量相同,但是值不同。
解决方案::在这种情况下,您只需从 main / res / values 文件夹中删除 colors.xml 。除非您为“当前的构建版本”缺少任何特定于口味的颜色属性,否则它不会产生任何错误。
检出我项目的主目录:
(如您在此处看到的,主资源目录不包含任何 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)要使布局取决于样式,请创建一个主题,该主题将根据样式继承MyStyle
或MyStyle.Red
在主要来源集中:
<style name="MyFlavorDependentStyle" parent="MyStyle"/>
在风味来源集中:
<style name="MyFlavorDependentStyle" parent="MyStyle.Red"/>
,并在布局中使用MyFlavorDependentStyle
。
答案 2 :(得分:0)
如果颜色是用XML定义的,只需将颜色定义从main/colors.xml
移到flavorA/colors.xml
和flavorB/colors.xml