首页 > 解决方案 > 访问 binding-Object 并遍历属性以访问我的所有自定义按钮

问题描述

你好,人类同胞,

我目前面临 Kotlin 语法差距...我的目标是遍历 GameFragmentBinding 对象并访问所有类型为 AreaView 的按钮(我的自定义按钮子类),我想在 for 循环中添加 clicklistener,如下例所示....我找到了使用 Kotlin 反射来访问绑定对象属性的选项,但我不清楚如何使用循环中的对象来设置每个按钮上的 clicklistener(按钮作为 THIS 对象的东西clickTitle(this)? ??)

期待您的提示!

Set the onClickListener for the submitButton
    binding.area0.setOnClickListener { clickTitle(binding.area0) }
    binding.area1.setOnClickListener { clickTitle(binding.area1) }
    binding.area2.setOnClickListener { clickTitle(binding.area2) }
    binding.area3.setOnClickListener { clickTitle(binding.area3) }
    binding.area4.setOnClickListener { clickTitle(binding.area4) }
    binding.area5.setOnClickListener { clickTitle(binding.area5) }
    binding.area6.setOnClickListener { clickTitle(binding.area6) }
    binding.area7.setOnClickListener { clickTitle(binding.area7) }
    binding.area8.setOnClickListener { clickTitle(binding.area8) }

   Crazy...
   for (prop in FragmentGameBinding::class.memberProperties){
   Log.d("Props","${prop.name}")
   if (prop.name == AreaView::class.qualifiedName){
   Log.d("Props","$prop")
   }
   }

目前弹出>

2020-12-04 13:39:39.578 28977-28977/com.sweed.customfancontroller D/Props: area0
2020-12-04 13:39:39.578 28977-28977/com.sweed.customfancontroller D/Props: area1
2020-12-04 13:39:39.578 28977-28977/com.sweed.customfancontroller D/Props: area2
2020-12-04 13:39:39.579 28977-28977/com.sweed.customfancontroller D/Props: area3
2020-12-04 13:39:39.579 28977-28977/com.sweed.customfancontroller D/Props: area4
2020-12-04 13:39:39.579 28977-28977/com.sweed.customfancontroller D/Props: area5
2020-12-04 13:39:39.579 28977-28977/com.sweed.customfancontroller D/Props: area6
2020-12-04 13:39:39.579 28977-28977/com.sweed.customfancontroller D/Props: area7
2020-12-04 13:39:39.579 28977-28977/com.sweed.customfancontroller D/Props: area8
2020-12-04 13:39:39.579 28977-28977/com.sweed.customfancontroller D/Props: gameTable
2020-12-04 13:39:39.579 28977-28977/com.sweed.customfancontroller D/Props: mGame
2020-12-04 13:39:39.579 28977-28977/com.sweed.customfancontroller D/Props: playerText
2020-12-04 13:39:39.579 28977-28977/com.sweed.customfancontroller D/Props: restartButton
2020-12-04 13:39:39.579 28977-28977/com.sweed.customfancontroller D/Props: textView
2020-12-04 13:39:39.579 28977-28977/com.sweed.customfancontroller D/Props: mBindingComponent

谢谢!

标签: androidkotlingenericsbindingmember

解决方案


除了使用反射或迭代ViewGroup子代之外,没有其他方法可以概括这一点。

您需要利用反射找到绑定对象的所有成员属性并设置点击侦听器:

binding::class.memberProperties.filter {
    it is AreaView 
}.forEach{
   it.setOnClickListener(::clickTitle)
}

将点击监听器分配给孩子:

binding.parentOfAllChildren.filter { it is AreaView }.forEach{
   it.setOnClickListener(::clickTitle)
}

推荐阅读