【问题标题】:Kotlin Android Studio Warning "Do not concatenate text displayed with setText. Use resource string with placeholders."Kotlin Android Studio 警告“不要用 setText 连接显示的文本。将资源字符串与占位符一起使用。”
【发布时间】:2019-03-12 06:36:12
【问题描述】:

我用 Kotlin 做了一个简单的程序来学习 android studio 中的连接。因此,我尝试从 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>

并将strings.xml资源中的%1$s替换为%1$d

警告消失了,但我遇到了问题,首先结果是整数,这不是我所期望的。应该是双倍的。其次,在 getString 中添加函数格式将停止程序并在屏幕上显示“Unexpected Error...”消息。

我该如何解决这个问题?

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    如果你有一些占位符的字符串,例如:

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

    首先你必须读取这个值然后填写它

    JAVA

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

    科特林

    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);
    

    科特林

    // 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

    【讨论】:

    • 应该怎么写?我从网络服务中得到它(它是一个数字),然后,我需要一个百分号。 it.data?.settlementPercentage.toString() + "%"
    • 尝试使用:%%,所以在文本中将是正常的% char。例如。 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

    【讨论】:

    • resultView.text = getString(R.string.txt_show, result) 在我使用 %1$d 时不起作用。因此,我必须将其更改为 %.2f 并且不再需要格式化函数来格式化为两位小数。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2016-01-14
    • 1970-01-01
    • 2019-02-22
    • 2015-12-15
    相关资源
    最近更新 更多