У меня есть проект в Android Studio, который использует разные вкусы для разных цветов (и некоторые другие вещи, но они не имеют значения).
Я хотел бы увидеть, как определенный элемент пользовательского интерфейса (все определяется файлами xml) выглядит не по умолчанию?
Допустим, у меня есть вкусы, аромат A, который используется по умолчанию, и аромат B, который не является. Допустим, основной цвет вкуса А — красный, а основной цвет вкуса В — зеленый.
Когда я открываю макеты, они всегда отображаются красным цветом, независимо от того, какой вариант в вариантах сборки выбран.
Я уверен, что есть способ сделать это, но я не знаю, как.
Edit1: Кажется, я этого не объяснил (думал, что это неявно). Мои файлы ресурсов для вкусов уже находятся в разных папках. Цвета в файлах ресурсов имеют одно и то же имя. Проблема не в этом, проблема в том, что я не вижу цвета в макетах внутри Android Studio.
Цвета в отдельных папках и работает как надо. Когда я создаю и устанавливаю ароматы, они используют свои цвета. Но когда я открываю макет, он всегда отображается с цветами по умолчанию в Android Studio.
отредактировал вопрос, чтобы он лучше объяснил мою проблему. Я уже использую отдельные файлы цветов для каждого вкуса.
есть ли какой-нибудь файл цветовых ресурсов в main?
если цвета определены в XML, просто переместите определение цветов с main/colors.xml
на flavorA/colors.xml
и flavorB/colors.xml
Let me blow out some dusts first :
Вы получаете цвета по умолчанию в своих файлах макетов, потому что ваши макеты находятся в папке по умолчанию (основной пакет в данном случае).
Что происходит здесь, так это то, что когда вы создаете сборку определенного варианта (скажем, вкусА), система упаковки берет файлы, специфичные для этого варианта, которые дублируются из папки по умолчанию, и заменяет их, чтобы предоставить вам специфичная для вкуса сборка.
Таким образом, ваш сгенерированный файл apk содержит специфичные для вкуса файлы(colors.xml в вашем случае) + файлы по умолчанию из основного(папка res основной, как и все макеты и другие ресурсы, а также файлы вашего класса), которые не являются частью вашей конкретной папки.
Именно поэтому все работает идеально.
Now back to point : (Hack)
Что вы должны сделать, чтобы увидеть макеты со специфическими цветами аромата?
«Хотя я бы не рекомендовал этот способ», если у вас нет другой логики макета для конкретной сборки, все, что вы можете сделать, это поместить определенные файлы макета (просто чтобы увидеть визуализированный вывод) в ваш папка макета под вашим директория flavorA.
Итак, теперь он будет брать цвета из папки вкусА и отображать ваш макет в IDE с этими цветами в вашем файле макета.
Примечание: Опять же, это просто хакерский способ увидеть разные вещи по-своему, а не решение. Несмотря на то, что я не думаю, что есть решение этой проблемы, потому что это не проблема, и именно так работает многовариантная система сборки gradle, и это не ошибка в этой системе..
Редактировать:
Итак, после некоторых исследований я выяснил, как вы можете добиться такой вещи, что «вы получаете визуализированный вывод на основе ваших цветов вкуса».
Допустим, у вас есть разные цвета в зависимости от ваших вкусов, как показано ниже:
Теперь содержимое аромат B и вкусW отличается для файла цвета.xml, но имеет одинаковые атрибуты цвета, например:
аромат B содержит:
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>
вкусW содержит:
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>
Как вы можете узнать, количество цветовых элементов одинаковое, но только значения разные.
Решение : В таком случае вы можете просто удалить цвета.xml из папки основное/рез/значения. Он не будет генерировать никаких ошибок, если вы не пропустите какой-либо атрибут цвета, специфичный для вашего «текущего варианта сборки».
проверьте главный директор для моего проекта:
(Как вы можете видеть здесь, основной каталог ресурсов не содержит файла цвета.xml)
Итак, если вы попытаетесь изменить свой вариант сборки и посмотрите на любой файл макета из основного, он откажется от этого конкретного цвета вкуса продукта для вас.
Примечание : Имейте в виду, что если вы добавить или удалить одного цвета из одного варианта, не забудьте также добавить/удалить его и в другие варианты, иначе ваш проект может получить ошибку при сборке. (вы также можете проделать тот же трюк с другими ресурсами, такими как чертежи, макеты, размеры и т. д., просто убедитесь, что каждый вариант содержит все это с одним и тем же именем ресурса)
Спасибо, я сам думал о таких вещах, но надеялся, что Android Studio сможет решить это для меня без взлома. Принимаю ваш ответ, так как сделаю что-то похожее: по умолчанию будет для тестирования, а варианты будут для окончательных сборок. Поэтому, если я хочу протестировать аромат A, я устанавливаю ресурсы аромата A по умолчанию, а если я хочу аромат B, я устанавливаю аромат B.
Не делайте этого, просто удалите colors.xml из основного, а затем поместите его во все варианты, как я предложил после Редактировать, он работает как шарм, как вы и хотели.
Я не уверен, можно ли повлиять на предварительный просмотр макета с помощью вкусов, но это определенно возможно с темами, поэтому позвольте мне предложить обходной путь.
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
в своем макете.
Честно говоря, это было бы отличным решением, если бы у меня не было много стилей, так что это меня больше смутит, чем поможет. В любом случае, отличное предложение, спасибо.
используйте отдельные файлы цветов для каждого вкуса, и имена ресурсов должны быть одинаковыми.