Скажем, у меня есть приложение с 2 темы: мужского и женского. Темы просто изменяют цветовую палитру и несколько чертежей, чтобы удовлетворить предпочтения пользователя.
Как насчет того, чтобы мы притворились, что вы делаете что-то еще? Это анти-шаблон дизайна, ассоциирующий определенные цвета на основе пола (например, «девушки, такие как розовый»).
Это не значит, что ваша техническая цель плохая, просто это действительно стереотипный пример.
Например, я мог бы добавить тему пирата, а затем «Отправить» будет «Arrrrgh!».
Только в случае, если «Отменить» отобразится «Аваст!».
Как я могу изменить строки во всем приложении через пользовательские темы?
Вы не сказали, откуда эти струны. Являются ли они строковыми ресурсами? Записи базы данных? Что вы получаете из веб-службы? Что-то другое?
На данный момент я предполагаю, что это строковые ресурсы. По определению вам нужно будет иметь N копий строк, по одной на тему.
Поскольку пол и пиратский статус не отслеживаются Android как возможные квалификаторы набора ресурсов, вы не можете иметь эти строковые ресурсы в разных наборах ресурсов. Хотя они могут быть в разных файлах (например, res/values/strings_theme1.xml
), имена файлов не являются частью идентификаторов ресурсов для строк. Таким образом, вам придется использовать какой-то префикс/суффикс, чтобы отслеживать, какие строки принадлежат тем (например, @string/btn_submit_theme1
).
Если эти строки не изменяются во время выполнения - это все, что находится в вашем ресурсе макета - вы можете взять страницу с Chris Jenkins' Calligraphy library. Он имеет свой собственный подкласс LayoutInflater
, используемый для перегрузки некоторых стандартных атрибутов XML. В его случае основное внимание уделяется android:fontFamily
, где он поддерживает это сопоставление с файлом шрифта в активах.
В вашем случае вы можете перегрузить android:text
. В вашем файле макета вместо того, чтобы указывать на какую-либо из ваших фактических строк, вы могли бы получить это базовое имя нужного вам строкового ресурса, без какого-либо идентификатора темы (например, если реальные строки: @string/btn_submit_theme1
и kin, вы можете иметь android:text="btn_submit"
). Ваш подкласс LayoutInflater
захватит это значение, добавит суффикс имени темы, используйте getIdentifier()
на вашем Resources
, чтобы найти фактический идентификатор ресурса строки, и оттуда получить строку, привязанную к вашей теме.
Отклонение от этого было бы поместить базовое имя в android:tag
вместо android:text
. android:text
может указывать на один из ваших реальных ресурсов строки, чтобы помочь с дизайном графического интерфейса и т. Д. Ваш LayoutInflater
захватит тег и будет использовать его для получения правильной строки во время выполнения.
Если вы будете заменять текст другим текстом, вырванным из тематических ресурсов строки, вы можете изолировать свою логику get-the-string-given-the-base-name в статическом утилите, где бы вы ни применили.
Хотя получение этого права первоначально потребует немного работы, оно будет масштабироваться до произвольной сложности с точки зрения количества видимых виджетах и строках пользовательского интерфейса. Вы все равно должны помнить, чтобы добавлять значения для всех тем для любых новых строк, которые вы определяете (бонусные баллы для создания пользовательской проверки Lint или задачи Gradle для проверки этого).
http://www.41post.com/4941/programming/android-get-string-resource-at-another-xml-namespace –
@IllegalArgument Мне должно быть что-то не хватает в этом сообщении в блоге. Я не понимаю, почему он даже делает то, что делает, потому что он все еще определяет 3 отдельные строки и имеет 3 отдельные кнопки, указывающие на эти строки. –