Предупреждение Kotlin Android Studio «Не объединяйте отображаемый текст с setText. Используйте строку ресурса с заполнителями.»

#android #kotlin

#Android #kotlin

Вопрос:

Я создал простую программу для изучения конкатенации в Android Studio с помощью Kotlin. Итак, я попытался получить строковое значение из ресурсов в strings.xml как показано ниже, и объедините со значением

 <string name="txt_show">Your lucky number is %1$s</string>
  

Я получил предупреждение «Не объединять текст …» от getString

 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val firstNumber = numEditText.text

    processButton.setOnClickListener {
        val result = concatText(firstNumber.toString().toDouble())
        resultView.text = getString(R.string.txt_show, " ")   result.format(2)

    }
}

private fun concatText(myNumber: Double): Double {
    val luckyNumber = 1.79
    return luckyNumber * myNumber
}
private fun Double.format(digits: Int) = java.lang.String.format("%.${digits}f", this)} 
  

Путем замены

 resultView.text = getString(R.string.txt.show, " ")   result.format(2)
  

с

 val finalResult =  result.toInt()<p>
resultView.text = getString(R.string.txt_show, finalResult)<p>
  

И замените %1$s на %1$d в ресурсах strings.xml

Предупреждение исчезло, но у меня возникли проблемы, сначала результат — целое число, что не то, что я ожидал. Оно должно быть двойным. Во-вторых, добавление формата функции в getString остановит программу с сообщением «Непредвиденная ошибка …» на экране.

Как я могу решить эту проблему?

Ответ №1:

Если у вас есть строка с некоторыми заполнителями, такими как:

 <string name="price_string">Your price: %d</string>
  

Сначала вы должны прочитать это значение, а затем заполнить его

JAVA

 String text = getString(R.string.price_string, 2.5);
  

KOTLIN

 val text = getString(R.string.price_string, 2.5)
  

.

или «более длинным» способом:

JAVA:

 // Read text
String priceString = getString(R.string.price_string);

// Fill it
String output = String.format(priceString, 2.5);
  

KOTLIN

 // Read text
val priceString = getString(R.string.price_string)

// Fill it
val output = String.format(priceString, 2.5)
// or
val output = priceString.format(2.5)
  

Если у вас есть, %s вы должны заполнить его String . Здесь у вас есть дополнительная информация: https://developer.android.com/guide/topics/resources/string-resource#formatting-strings

Комментарии:

1. как я должен это написать? Я получаю это из веб-службы (это число), и после этого мне нужен символ процента. it.data?.settlementPercentage. toString() «%»

2. Попробуйте использовать: %% , чтобы в тексте был обычный % символ. Например. String.format("%s%%, discount)

Ответ №2:

сначала результат является целым числом, чего я не ожидал. Оно должно быть двойным.

Тогда почему вы позвонили toInt ? Просто используйте

 resultView.text = getString(R.string.txt_show, result) 
  

и %1$.2f (или просто %.2f ) в строке вместо %1$d для форматирования до двухзначного дробного числа. Вы можете видеть, что она указана так же, как в format функции в вашем коде. Документация по строкам формата (что все это %d означает и т.д.) находится по адресу https://developer.android.com/reference/java/util/Formatter.html.

Комментарии:

1. resultView.text = getString(R.string.txt_show, результат) не работает, когда я использую %1 $ d. Итак, я должен изменить его на %.2f, и мне больше не нужна функция format для форматирования в двухзначное дробное число. Спасибо.