Почему строка не была заменена, если она из файла ресурсов строки в Kotlin? - PullRequest
0 голосов
/ 30 июня 2018

Когда я использую код A, я получаю исходную строку, почему?

Код B может заменить строку как ${myObject.status}, так и ${myObject.name}, результат в порядке.

Изображение

enter image description here

Код A

<string name="DetailsOfWiFiDef">The WiFi status is ${myObject.status},
        the name of WiFi is ${myObject.name}\n\n
</string>

val myObject=getIt()
val s=mContext.getString(R.string.DetailsOfWiFiDef)
val sb = StringBuilder()
sb.append(s)  //The string keep original

Код B

val myObject=getIt()
val k="The WiFi status is ${myObject.status},the name of WiFi is ${myObject.name} \n"
val sb = StringBuilder()
sb.append(k)  //It has been replaced         

1 Ответ

0 голосов
/ 30 июня 2018

Компилятор Kotlin преобразует строковые литералы в цепочку StringBuilder во время компиляции:

// code in Kotlin
val k = "The WiFi status is ${myObject.status},the name of WiFi is ${myObject.name} \n"

// is converted into equivalent of code in Java
String k = new StringBuilder("The WiFi status is ").append(myObject.getStatus()).append(",the name of WiFi is ").append(myObject.getName()).append(" \n");

Если вы загружаете ресурсы, конвертация не производится, она используется как есть. Однако вы можете использовать форматируемый строковый ресурс :

<string name="DetailsOfWiFiDef">The WiFi status is %1$s,
        the name of WiFi is %2$s\n\n
</string>

Затем вставьте аргументы при чтении строки (Android Studio даже исправит вас, если вы предоставите слишком много аргументов или неверный тип в реальном времени):

val s=mContext.getString(R.string.DetailsOfWiFiDef, myObject.status, myObject.name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...