如何在Kotlin中迭代变量名?

时间:2019-05-09 14:57:37

标签: android kotlin

我正在做一个有很多按钮的项目。我想按名称重复这些按钮。它们都被命名为“ levelXbutton”,其中X可以是一个大数字。

我现在用很多行代码来做。但我敢肯定,有一种方法可以循环执行此操作,尤其是在Kotlin中。

例如,这是我要执行的操作之一:

if(FacadeData.getLastUnlockedLevel()<2){ binding.lvl2Button.setTextColor(Color.WHITE)}
if(FacadeData.getLastUnlockedLevel()<3){ binding.lvl3Button.setTextColor(Color.WHITE)}
if(FacadeData.getLastUnlockedLevel()<4){ binding.lvl4Button.setTextColor(Color.WHITE)}
if(FacadeData.getLastUnlockedLevel()<5){ binding.lvl5Button.setTextColor(Color.WHITE)}

2 个答案:

答案 0 :(得分:0)

您可以循环遍历按钮的编号,然后使用类似的字符串加载其ID:

for (i in 0..20) {
    val layoutID = context.resources.getIdentifier("lvl${i}Button", "id", context.packageName)
    val button = findViewById(layoutID) as Button

    ...

}

答案 1 :(得分:0)

也许您应该尝试这样的事情:

class MainActivity : AppCompatActivity() {

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

        applyChangeRecursively(findViewById<ViewGroup>(android.R.id.content)) {
            it.setBackgroundColor(Color.WHITE)
        }

    }

    fun getResourceName(view:View):String? {
        if (view.id > 0 && view is Button) {
            return view.resources.getResourceName(view.id)
        }
        return null
    }

    fun matchesLabel(resourceName:String?):Boolean = resourceName?.matches(Regex(".*lvl\\d+Button")) ?: false

    fun applyChange(v:View, u:(View)->Unit) = v.run(u)
    fun applyChangeRecursively(parent:View, fun1:(View)->Unit){
        when (parent) {
            is ViewGroup -> parent.children.forEach{ applyChangeRecursively(it, fun1) }
            else -> if(matchesLabel(getResourceName(parent))) { applyChange(parent, fun1) }
        }
    }

}