You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:49:44