android - 访问 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
谢谢!
解决方案
除了使用反射或迭代ViewGroup
子代之外,没有其他方法可以概括这一点。
您需要利用反射找到绑定对象的所有成员属性并设置点击侦听器:
binding::class.memberProperties.filter {
it is AreaView
}.forEach{
it.setOnClickListener(::clickTitle)
}
将点击监听器分配给孩子:
binding.parentOfAllChildren.filter { it is AreaView }.forEach{
it.setOnClickListener(::clickTitle)
}
推荐阅读
- java - 如何在 Java 中将此日期格式“2019 年 6 月 12 日星期三 14:23:39”解析为“2019-03-05T11:56:13Z”?
- python - 如何将张量变量传递给 feed_dict?
- c# - 一种查找具有给定接口的所有类并异步执行每个类中的方法并返回收集的结果的方法?
- django - 在 ModelChoiceField 中渲染图像列表
- highcharts - Highcharts tickAmount 减 1
- amazon-web-services - 通过 vpn 或公共延迟到 AWS 的数据中心
- mysql - 无法创建连接:连接详细信息无效。请确认您输入了正确的连接详细信息
- jenkins - Jenkins 构建失败时如何列出罪魁祸首用户(由 Slack 发送)
- docker - Nginx 变量忽略大小写
- python-3.x - 模块未正确安装/运行