Является ли конкатенация строк ресурсов/конкатенации строк, возможна ли в файле макета?

У меня есть строки ресурсов:

<string name="address">Address</string>
<string name="city">City</string>
<string name="country">Country</string>
<string name="pincode">Pincode</string>  

В моем приложении, в нескольких местах, я использую эти строки в одиночку, и в нескольких местах я преуспеваю в них с помощью двоеточия.
Я не собираюсь создавать еще четыре строки ресурсов:

<string name="address_with_colon">Address: </string>
<string name="city_with_colon">City: </string>
<string name="country_with_colon">Country: </string>
<string name="pincode_with_colon">Pincode: </string>  

Теперь, чтобы достичь этого, мне нужно объединить строки ресурсов с двоеточием. Я знаю, что это очень просто, хотя код Java, который я могу написать в своем классе активности. Но я хочу сделать конкатенацию в моем файле макета.
Вопрос: возможна ли конкатенация строк в файле макета?
Здесь я должен выполнить конкатенацию:

android:text="concatenation_if_possible"

Ответ 1

Вопрос: Возможна ли последовательность конкатенации в файле макета?

Нет, насколько я знаю.

Одним из решений является использование того, что ответила @DIVA раньше.

Другим возможным решением является создание настраиваемого представления, которое расширяет TextView (или представление, которое вы хотите достичь), и создавайте настраиваемый атрибут custom:concatenate, который получает строковое задание и выполняет конкатенацию автоматически. ИМХО Я считаю, что это самый чистый подход.

В коде будет выглядеть так:

<com.whatever.ConcatenateTextView
    android:text="@string/whatever"
    custom:concatenate="@string/second_string"/>

Или... вы можете использовать силу Drawables, создавая пользовательский TextDrawable (который очень хорошо объясняется @Devunwired в этот пост и конкретный его реализация в Github).

Копирование того, что @Devunwired сказал в своем сообщении об этом:

С этим классом текст теперь может быть частью мира Drawable, то есть его можно не только устанавливать отдельно в местах, где вы обычно помещаете изображение, но также можете размещаться вместе с другими Drawables в контейнерах, таких как StateListDrawable или анимированные с подобными TransitionDrawable и ClipDrawable. Во многих случаях мы можем использовать это для выполнения задания, которое в противном случае потребовало бы нескольких видов или составных элементов управления только для достижения заданного визуального эффекта; таким образом, он может уменьшить накладные расходы в иерархии вашего представления.

Это в сочетании с вашим пользовательским TextView, как я объяснял ранее (или любой другой вид, который вы хотите использовать) дает вам очень мощный вариант. Опять копируя пример, который @Devunwired написал в своем сообщении:

ImageView mImageOne;
TextDrawable d = new TextDrawable(this);
d.setText("SAMPLE TEXT\nLINE TWO");
d.setTextAlign(Layout.Alignment.ALIGN_CENTER);

mImageOne.setImageDrawable(d);

Если вам нужна дополнительная помощь, пожалуйста, дайте мне знать в комментариях, и я с удовольствием обновлю ответ!

Ответ 2

Используя XML-сущности, можно использовать одну и ту же строку в XML файле:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
  <!ENTITY appname "MrQuery">
  <!ENTITY author "Oded">
]>

<resources>
    <string name="app_name">&appname;</string>
    <string name="description">The &appname; app was created by &author;</string>
</resources>

Я использовал этот ответ: динамическая строка с использованием String.xml?

Ответ 3

Вы можете сделать что-то вроде этого:

<string name="meatShootingMessage">You shot %1$d pounds of meat!</string>

String strMeatMsg = String.format(strMeatFormat, ":");

textview.setText(strMeatMsg);

Ответ 4

Нет, вы не можете объединить несколько строковых ресурсов в одну строку, когда напрямую ссылаетесь на эти строки из файла макета.

Файлы макета XML - это просто шаблон инструкций для Android для создания пользовательского интерфейса, и вы должны рассматривать их как более чистый и более организованный способ создания пользовательского интерфейса, чем использование класса Java, который вручную создает и позиционирует представления в макете, При этом существуют ограничения на то, что вы можете сделать с файлом макета, и один из них может ссылаться на один ресурс строки из каждого представления, что означает, что вы не можете сделать ничего более сложного, чем это, включая объединение нескольких строки в один.