Я хотел бы сослаться на строку из другой строки в моем файле strings.xml, как показано ниже (особенно обратите внимание на конец содержимого строки "message_text"):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="button_text">Add item</string>
<string name="message_text">You don't have any items yet! Add one by pressing the \'@string/button_text\' button.</string>
</resources>
Я пробовал приведенный выше синтаксис, но затем текст выводит текст "@ string / button_text" в виде открытого текста. Не то, что я хочу. Мне бы хотелось, чтобы в тексте сообщения было напечатано: «У вас еще нет элементов! Добавьте один, нажав кнопку« Добавить элемент »».
Есть ли какой-нибудь известный способ добиться того, чего я хочу?
ОБОСНОВАНИЕ: У
моего приложения есть список элементов, но когда этот список пуст, вместо этого я показываю TextView «@android: id / empty». Текст в этом TextView должен информировать пользователя о том, как добавить новый элемент. Я хотел бы сделать мой макет защищенным от изменений (да, я дурак, о котором идет речь :-)
Ответы:
Хороший способ вставить часто используемую строку (например, имя приложения) в XML без использования кода Java: источник
ОБНОВИТЬ:
Вы даже можете определить свою сущность глобально, например:
разреш / сырой / entities.ent:
Рез / значения / string.xml:
источник
Можно ссылаться друг на друга, если вся ваша строка состоит из имени ссылки. Например, это будет работать:
Это еще более полезно для установки значений по умолчанию:
Теперь вы можете использовать
string_default
везде в своем коде, и вы можете легко изменить значение по умолчанию в любое время.источник
Я думаю, что вы не можете. Но вы можете «отформатировать» строку так, как вам нравится:
В коде:
источник
String text = res.getString(R.string.message_text, res.getString(R.string.button_text));
немного чище.В Android вы не можете объединять строки внутри XML
Следующее не поддерживается
Проверьте эту ссылку ниже, чтобы узнать, как этого добиться
Как объединить несколько строк в Android XML?
источник
Я создал простой Gradle плагин который позволяет ссылаться на одну строку из другой. Вы можете ссылаться на строки, которые определены в другом файле, например, в другом варианте сборки или библиотеке. Минусы этого подхода - IDE-рефактор не найдет таких ссылок.
использование
{{string_name}}
синтаксис для ссылки на строку:Чтобы интегрировать плагин, просто добавьте следующий код на уровень вашего приложения или модуля библиотеки
build.gradle
файлОБНОВЛЕНИЕ: Библиотека не работает с плагином Android Gradle версии 3.0 и выше, поскольку в новой версии плагина используется aapt2, который упаковывает ресурсы в двоичный формат .flat, поэтому упакованные ресурсы для библиотеки недоступны. В качестве временного решения вы можете отключить aapt2, установив android.enableAapt2 = false в файле gradle.properties.
источник
> Could not get unknown property 'referencedString'
Вы можете использовать свою собственную логику, которая рекурсивно разрешает вложенные строки.
От
Activity
, например, назвать это такисточник
Я знаю, что это старый пост, но я хотел бы поделиться быстрым и грязным решением, которое я придумал для моего проекта. Это работает только для TextViews, но может быть адаптировано и для других виджетов. Обратите внимание, что для этого требуется, чтобы ссылка была заключена в квадратные скобки (например
[@string/foo]
).Недостатком этого подхода является
setText()
преобразование вCharSequence
aString
, что является проблемой, если вы передаете такие вещи, как aSpannableString
; для моего проекта это не было проблемой, так как я использовал его только для того,TextViews
чтобы мне не нужно было получать доступ от моегоActivity
.источник
С новой привязкой данных вы можете объединять и делать намного больше в своем XML.
например, если вы получили message1 и message2, вы можете:
Вы даже можете импортировать некоторые текстовые утилиты и вызвать String.format и друзей.
к сожалению, если вы хотите использовать его в нескольких местах, это может привести к путанице, вам не нужно, чтобы этот фрагмент кода был везде. и вы не можете определить их в xml в одном месте (не то, что я знаю), поэтому вы можете создать класс, который будет инкапсулировать эти композиции:
тогда вы можете использовать его вместо этого (вам нужно будет импортировать класс с привязкой данных)
источник
В дополнение к вышеупомянутому ответу Франческо Лаурита https://stackoverflow.com/a/39870268/9400836
Кажется, что есть ошибка компиляции "& entity; была указана, но не объявлена", которая может быть решена путем ссылки на внешнее объявление следующим образом
разреш / сырой / entities.ent
RES / значения / strings.xml
Хотя он компилируется и запускается, он имеет пустое значение. Может кто знает как это решить. Я бы оставил комментарий, но минимальная репутация - 50.
источник
Вы можете использовать строковые заполнители (% s) и заменить их с помощью Java во время выполнения
и в Яве
а затем установить его на то место, где он использует строку
источник
%1$s
,%2$s
и т.д. вместо%s
.Я создал небольшую библиотеку, которая позволяет вам разрешать эти заполнители во время сборки, поэтому вам не нужно добавлять какой-либо код Java / Kotlin для достижения желаемого.
Исходя из вашего примера, вам нужно настроить строки следующим образом:
И тогда плагин позаботится о генерации следующего:
Это работает также для локализованных и измененных строк, а также сгенерированные строки будут обновляться всякий раз, когда вы вносите изменения в свои шаблоны или их значения.
Более подробная информация здесь: https://github.com/LikeTheSalad/android-string-reference
источник