我正在学习用android构建一个简单的android应用程序,我创建了一个函数来找到一些价值的id。在编写这个函数时,我想使用时间语句(Kotlin),但遗憾的是不得不重复它。是否有方法同时将there语句的结果赋值给多个变量?在另一种语言中,我只会返回一个列表,我本来会拆开的,但是我找不到用Kotlin语言做这件事的方法。这不是什么大问题,但我喜欢优化我的代码。
// my Kotlin function
// setting a specific state
private fun setState(num: Int) {
Log.v(TAG, num.toString())
// get the correct image id
val imageId: Int? = when (num) {
0 -> R.drawable.lemon_restart
1 -> R.drawable.lemon_tree
2 -> R.drawable.lemon_squeeze
3 -> R.drawable.lemon_drink
else -> null
}
// get the correct text to show
val txtId: Int? = when (num) {
0 -> R.string.txt_state_0
1 -> R.string.txt_state_1
2 -> R.string.txt_state_2
3 -> R.string.txt_state_3
else -> null
}
// get the correct content description for accessibility
val contentDescriptionId: Int? = when (num) {
0 -> R.string.lemon_restart_description
1 -> R.string.lemon_tree_description
2 -> R.string.lemon_squeeze_description
3 -> R.string.lemon_drink_description
else -> null
}
// setting the new stuff
val imView: ImageView = findViewById(R.id.imageState)
val txtView: TextView = findViewById(R.id.textOrder)
txtView.text = getString(txtId!!)
imView.setImageResource(imageId!!)
imView.contentDescription = getString(contentDescriptionId!!)
}
请尽可能地优化它。
发布于 2021-12-30 12:03:57
发布于 2021-12-30 12:39:46
因为每个字段都是常数,状态是固定的。你可以使状态保持不变。为了稍微解耦代码,您可以创建一个单独的类来返回特定状态的值。以下是一个例子:
class StateHandle private constructor(imageId: Int?, txtId: Int?, contentDescriptionId: Int?) {
companion object {
private val imageIds = arrayOf(
R.drawable.lemon_restart,
R.drawable.lemon_tree,
R.drawable.lemon_squeeze,
R.drawable.lemon_drink
)
private val txtIds = arrayOf(
R.string.txt_state_0,
R.string.txt_state_1,
R.string.txt_state_2,
R.string.txt_state_3
)
private val contentIds = arrayOf(
R.string.lemon_restart_description,
R.string.lemon_tree_description,
R.string.lemon_squeeze_description,
R.string.lemon_drink_description
)
@JvmStatic
fun getStateFor(num: Int): StateHandle {
return StateHandle(
imageIds.getOrNull(num), txtIds.getOrNull(num),
imageIds.getOrNull(num)
)
}
}
}
它并不完美,但它的可重用性更强一些。只需调用#getStateFor
并使用StateHandle
对象即可。
https://stackoverflow.com/questions/70531303
复制相似问题