Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot resolve string supplied to vararg parameter in extension function

strings.xml

<string name="my_string">Showing your number: %1$s</string>

ActivityExt.kt

fun Activity.showToast(textResId: Int, vararg formatArgs: String) {
    val text = getString(textResId, formatArgs)
    Toast.makeText(this, text, Toast.LENGTH_SHORT).show()
}

MainActivity.kt

val number = 11
showToast(R.string.my_string, number.toString())

Toast with following text is showing:

Showing your number: [Ljava.lang.String;@2cfa3b]

Why this happens?

like image 894
Yuriy Seredyuk Avatar asked Jun 28 '17 09:06

Yuriy Seredyuk


2 Answers

Use the spread operator:

fun Activity.showToast(textResId: Int, vararg formatArgs: String) {
    val text = getString(textResId, *formatArgs)
    Toast.makeText(this, text, Toast.LENGTH_SHORT).show()
}

Currently, you're passing an array as the format argument. By using the spread operator you pass the contents of the array as the format argument.

like image 146
nhaarman Avatar answered Oct 09 '22 08:10

nhaarman


You should use the spread operator to pass in the varargs to the getString function:

val text = getString(textResId, *formatArgs)

This is because the type of formatArgs inside the showToast function is Array<String> (there's no vararg type or anything like that), and if you pass that in without the *, you'll only pass a single parameter, which will be the array instead of its contents.

like image 14
zsmb13 Avatar answered Oct 09 '22 07:10

zsmb13