Android数独求解器开发:点击选中TextView并通过按钮修改文本
实现Android数独单元格选中与按钮修改文本的方案
嘿,这个需求我之前做数独App的时候也遇到过,核心就是跟踪选中的单元格,然后在按钮点击时针对性修改内容。下面是具体的实现步骤,一步步来:
1. 定义全局变量保存选中的TextView
首先在你的Activity/Fragment里声明一个全局变量,用来记录当前被选中的单元格:
private TextView selectedCell; // 保存当前选中的单元格
2. 给每个TextView添加选中逻辑
不管你是通过代码动态创建TextView,还是XML里写好的TableLayout,都要给每个单元格设置点击事件,实现选中状态的切换和记录:
动态创建单元格的情况(适合9x9数独)
TableLayout tableLayout = findViewById(R.id.sudoku_table); for (int row = 0; row < 9; row++) { TableRow tableRow = new TableRow(this); tableRow.setLayoutParams(new TableLayout.LayoutParams( TableLayout.LayoutParams.MATCH_PARENT, 0, 1f // 让每行的单元格均分高度 )); for (int col = 0; col < 9; col++) { TextView cell = new TextView(this); // 设置单元格的基础样式:居中、字体大小、边框等 cell.setGravity(Gravity.CENTER); cell.setTextSize(20); cell.setBackgroundResource(R.drawable.cell_border); // 自定义边框drawable,提升视觉效果 cell.setLayoutParams(new TableRow.LayoutParams( 0, TableRow.LayoutParams.MATCH_PARENT, 1f // 让每列的单元格均分宽度 )); // 点击事件:切换选中状态 cell.setOnClickListener(v -> { // 先重置上一个选中单元格的样式 if (selectedCell != null) { selectedCell.setBackgroundResource(R.drawable.cell_border); // 恢复默认边框 selectedCell.setTextColor(Color.BLACK); // 恢复默认文字颜色 } // 记录当前选中的单元格 selectedCell = (TextView) v; // 给选中的单元格添加明显视觉反馈 selectedCell.setBackgroundResource(R.drawable.cell_selected_border); // 选中状态的边框 selectedCell.setTextColor(Color.BLUE); // 选中状态的文字颜色 }); tableRow.addView(cell); } tableLayout.addView(tableRow); }
XML布局定义单元格的情况
如果你的TableLayout是在XML里写好的(比如每个TextView有id:cell_0_0到cell_8_8),可以用循环遍历子View来批量设置点击事件:
TableLayout tableLayout = findViewById(R.id.sudoku_table); for (int row = 0; row < tableLayout.getChildCount(); row++) { View child = tableLayout.getChildAt(row); if (child instanceof TableRow) { TableRow tableRow = (TableRow) child; for (int col = 0; col < tableRow.getChildCount(); col++) { View cellView = tableRow.getChildAt(col); if (cellView instanceof TextView) { TextView cell = (TextView) cellView; // 复用选中逻辑 cell.setOnClickListener(v -> { if (selectedCell != null) { selectedCell.setBackgroundResource(R.drawable.cell_border); } selectedCell = (TextView) v; selectedCell.setBackgroundResource(R.drawable.cell_selected_border); }); } } } }
3. 按钮点击修改选中单元格的文本
给数字按钮(比如1-9的按钮)设置点击事件,先判断是否有选中的单元格,再修改文本:
// 以数字1按钮为例 Button btn1 = findViewById(R.id.btn_number_1); btn1.setOnClickListener(v -> { // 先检查是否选中了单元格 if (selectedCell == null) { Toast.makeText(this, "请先选中一个单元格哦!", Toast.LENGTH_SHORT).show(); return; } // 修改选中单元格的文本 selectedCell.setText("1"); // 如果你需要处理数独的合法性校验,可以在这里添加逻辑(比如检查同行/同列是否重复) });
额外优化建议
- 视觉反馈优先:一定要给选中的单元格设置明显的样式差异,让用户直观知道选中状态,避免操作困惑。
- 处理横竖屏切换:如果支持横竖屏,记得在
onSaveInstanceState里保存选中单元格的行列位置,恢复时重新选中,避免状态丢失。 - 限制输入范围:通过按钮控制输入(只允许1-9),避免用户手动输入无效内容,也可以给TextView设置输入过滤进一步约束。
内容的提问来源于stack exchange,提问作者webwizard77
相关产品推荐
相关产品推荐

