2015-01-22 3 views
0

Позвольте мне начать с описания моей проблемы. Я работаю над большим Android-приложением, которое имеет большое количество макетов и строк (все в strings.xml). Было сделано новое требование, которое требует, чтобы некоторые из строк были разными в зависимости от состояния при запуске (подумайте, что все экземпляры «кошки» заменены на «собаку»). Это условие НЕ зависит от чего-либо с устройством (локаль, размер, разрешение и т. Д.): Это зависит только от чего-то в бизнес-логике.Можно ли вручную переключать ресурсы строки во время выполнения?

Простейшим подходом было бы создать новые копии всех файлов макета, которые используют строки, которые имеют «cat», а в этих новых макетах вместо них используются строки, которые имеют «собаку». Однако это не вполне возможно из-за количества макетов, а также будущих проблем обслуживания в основном дублированных макетах.

Я знаю, что это не дискуссионный форум, поэтому у меня есть подход, на который я хотел бы остановиться. Мне кажется, что проблема тесно связана с нормальной конфигурацией ресурсов/локалью, где различные ресурсы предоставляются за счет атрибутов устройства. Есть ли способ заставить это работать для моей ситуации? Различия в том, что желаемая конфигурация известна только во время выполнения, и нет существующего квалификатора ресурсов, который имеет смысл (мы могли бы перевести на французский язык, например, поэтому я не хочу, чтобы на него навязываться). Я не могу себе представить, что моя проблема уникальна.

Если есть другой подход, я должен использовать, дайте мне знать, хотя я не хочу заходить слишком далеко в маршрут обсуждения, потому что SO нахмурился. Честно говоря, это, вероятно, рискованно, даже спрашивая об этом здесь, но я не знаю, где еще спросить об этом.

+0

Возможно использовать string.format() и отформатировали строки в вашем ресурсов XML? Например, будет 'string.format (« эй, это% s »,« собака »);' где бы вы ни хотели замену. Ваша строка xml будет содержать Это% s. Это решение будет работать в коде, хотя и будет нелегко (или вообще) выполнимо полностью в xml, я считаю. У вашего макета все еще может быть 'android: text =" @ string/my_string ", но ваша бизнес-логика должна соответствующим образом форматировать его. – kha

+0

Да, я думал об этом, но, как вы сказали, это не сработает для XML. Проблема заключается в том, что подавляющее большинство замещений, которые мне нужно сделать, - это метки, которые в настоящий момент не затронуты никаким кодом, поэтому это будет довольно много изменений. –

ответ

0

Я могу думать о нескольких решениях:

Вы можете установить строку на время выполнения, как yourTextView.setText(R.string.any_string) с:

1) A Для того, чтобы иметь какие-то ресурсы строк для вас бизнес-логики.
2) placeholder string,

getResources().getString(R.string.tempale, "your value") 

3) Получить строку из веб-службы, если это

Возможное
Смежные вопросы