Как перебирать имена переменных в Kotlin? - PullRequest
0 голосов
/ 09 мая 2019

Я делаю проект, который имеет много кнопок. Я хотел бы перебрать эти кнопки по имени. Все они называются 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 голосов
/ 10 мая 2019

Может быть, вы должны попробовать что-то вроде этого:

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

}
0 голосов
/ 09 мая 2019

Вы можете сделать цикл, чтобы просмотреть номера кнопок, а затем загрузить их идентификаторы строкой, например:

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

    ...

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...