Android 10x10 TableLayout中无需给每个按钮设ID如何识别点击事件
问题原因
你之前的代码没有响应点击,核心原因是 Button作为可点击控件,会优先消费触摸事件,你给父布局TableRow设置的点击监听器根本收不到点击事件。
解决方案
不需要给每个按钮设置ID,直接遍历TableLayout下所有的Button,统一绑定同一个点击监听器即可,还能直接获取到点击按钮的行、列位置来识别具体是哪个按钮被点击:
实现代码
val table : TableLayout = findViewById(R.id.table1) // 统一的点击监听器,所有按钮共用这一个 val buttonClickListener = View.OnClickListener { v -> // 直接拿到被点击的按钮实例 val clickedButton = v as Button // 实现点击变色逻辑,示例为把按钮背景改为红色 clickedButton.setBackgroundColor(Color.RED) // 如需判断按钮位置,可获取对应的行列索引(索引从0开始计数) val tableRow = clickedButton.parent as TableRow val rowIndex = table.indexOfChild(tableRow) // 按钮所在行的索引 val colIndex = tableRow.indexOfChild(clickedButton) // 按钮所在列的索引 // 也可以直接拿按钮上的文本作为识别标识 val buttonText = clickedButton.text.toString() Log.i("TAG", "点击了第${rowIndex+1}行第${colIndex+1}个按钮,按钮文本:$buttonText") } // 遍历TableLayout下所有TableRow,给里面的Button批量绑定监听器 for (i in 0 until table.childCount) { val row = table.getChildAt(i) as TableRow for (j in 0 until row.childCount) { val child = row.getChildAt(j) if (child is Button) { child.setOnClickListener(buttonClickListener) } } }
可选优化
如果需要给按钮绑定自定义识别标识,可直接在XML的Button节点添加android:tag属性,不需要设置ID:
<Button android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="Button 1" android:tag="custom_flag_1" />
点击时直接读取tag即可识别按钮:
val btnFlag = clickedButton.tag.toString()
扩展提示
后续如果要生成100个按钮,建议直接用代码动态生成TableRow和Button,不需要写XML布局,生成组件的时候直接绑定监听器即可,开发效率更高。
内容的提问来源于stack exchange,提问作者francisRH
相关产品推荐
相关产品推荐

