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

Android Studio中Bingo应用第二个页面按钮点击无响应求助

Bingo应用DisplayActivity按钮点击无响应问题修复

问题描述

开发一款三页面Bingo期末作业时,DisplayActivity页面的所有按钮点击无响应,其他页面按钮正常工作。

问题页面界面

DisplayActivity界面

相关代码

DisplayActivity代码

public class DisplayActivity extends AppCompatActivity {
    private static final String BINGO_HISTORY_FILE = "bingohistory.txt";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display);

        // 获取MainActivity中数组内容并展示
        TextView txtCurrent = (TextView) findViewById(R.id.txtCurrent);
        int[] NumbersCalled = MainActivity.NumbersCalled;
        final String outputString = getOutputString(NumbersCalled);
        txtCurrent.setText("Numbers called: " + outputString);


        // 返回主菜单按钮的事件处理器
        Button returnBtn = (Button) findViewById(R.id.btnReturn);
        returnBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MainActivity.NumbersCalled = NumbersCalled;
                DisplayActivity.this.finish();
                startActivity(new Intent(DisplayActivity.this, MainActivity.class));
            }
        });

        // 保存按钮的事件处理器
        Button saveBtn = (Button) findViewById(R.id.btnReturn);
        saveBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 游戏结束后保存当前 Bingo 号码
                writeToFile(outputString);
            }
        });
    }

    private String getOutputString(int[] NumbersCalled) {
        String temp = "";
        for (int i = 0; i < NumbersCalled.length; i++) {
            temp += NumbersCalled[i] + " ";
        }
        final String outputString = temp;
        return outputString;
    }

    protected void writeToFile(String data) {
        // 将当前号码写入"bingohistory.txt"文本文件。
        // 尝试写入文件时检查异常
        FileOutputStream file = null;
        try {
            file = openFileOutput(BINGO_HISTORY_FILE,
                    DisplayActivity.this.MODE_PRIVATE);
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(DisplayActivity.this,
                    "Couldn't find file", Toast.LENGTH_LONG).show();
        }
        OutputStreamWriter osw = new OutputStreamWriter(file);
        BufferedWriter bw = new BufferedWriter(osw);
        try {
            bw.write(data);
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(DisplayActivity.this,
                    "Couldn't write to file", Toast.LENGTH_LONG).show();
        }
        try {
            bw.newLine();
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(DisplayActivity.this,
                    "Couldn't write to file", Toast.LENGTH_LONG).show();
        }
        try {
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(DisplayActivity.this,
                    "Couldn't write to file", Toast.LENGTH_LONG).show();
        }
        try {
            osw.close();
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(DisplayActivity.this,
                    "Couldn't write to file", Toast.LENGTH_LONG).show();
        }
    }
}

MainActivity代码

public class MainActivity extends AppCompatActivity {
    // 声明类级变量
    public static int currentNumber;
    public static int[] NumbersCalled = {currentNumber};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 获取第一个要显示的号码,保存到NumbersCalled数组并显示在TextView中
        TextView txtCurrentNumber = (TextView) findViewById(R.id.txtNumber);
        getAndSaveNewNumber();
        txtCurrentNumber.setText(String.valueOf(currentNumber));

        // 退出按钮的事件处理器
        Button exitAppBtn = (Button) findViewById(R.id.btnExit);
        exitAppBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 结束并退出应用
                MainActivity.this.finish();
                System.exit(0);
            }
        });

        // 下一个按钮的事件处理器
        Button nextBtn = (Button) findViewById(R.id.btnNext);
        nextBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 获取下一个要显示的号码,保存到NumbersCalled数组并显示在TextView中
                getAndSaveNewNumber();
                txtCurrentNumber.setText(String.valueOf(currentNumber));
            }
        });

        // Bingo按钮的事件处理器
        Button bingoBtn = (Button) findViewById(R.id.btnBingo);
        bingoBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, DisplayActivity.class).putExtra("NumbersCalled", NumbersCalled));
            }
        });

        // 显示按钮的事件处理器
        Button displayBtn = (Button) findViewById(R.id.btnDisplay);
        displayBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, DisplayActivity.class).putExtra("NumbersCalled", NumbersCalled));
            }
        });

        // 历史记录按钮的事件处理器
        Button historyBtn = (Button) findViewById(R.id.btnHistory);
        historyBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, HistoryActivity.class));
            }
        });
    }

    // 生成新的随机数并保存到NumbersCalled数组,然后将数组按升序排序
    public void getAndSaveNewNumber() {
        currentNumber = (int)Math.floor(Math.random() * (99 - 0 + 1) + 0);

        // 检查号码是否已被调用,若是则不添加到数组也不显示
        if (checkNumbersCalled(currentNumber)) {
            currentNumber = (int)Math.floor(Math.random() * (99 - currentNumber + 1) + 0);
            saveNewNumber();
        } else {
            saveNewNumber();
        }

        // 将数组按升序排序
        Arrays.sort(NumbersCalled);
    }

    // 遍历NumbersCalled数组,检查n是否已在数组中
    public boolean checkNumbersCalled(int n) {
        for (int i = 0; i < NumbersCalled.length; i++) {
            if (NumbersCalled[i] == currentNumber) {
                return true;
            }
        }
        return false;
    }

    // 将号码添加到数组
    public void saveNewNumber() {
        // 添加号码到数组
            // 创建包含当前号码的新数组,然后替换NumbersCalled数组
            int n = NumbersCalled.length;
            int[] NewArray = new int[n + 1];
            for (int i = 0; i < n; i++) {
                NewArray[i] = NumbersCalled[i];
            }
            NewArray[n] = currentNumber;
            NumbersCalled = NewArray;
    }
}

问题根源

DisplayActivity中保存按钮的ID绑定错误:代码里保存按钮使用了R.id.btnReturn(和返回按钮相同的ID),导致返回按钮的点击事件被覆盖,而界面上真正的保存按钮从未绑定点击事件;重复绑定同一个按钮的点击事件,进一步引发按钮响应异常。

修复方案

  1. 修正保存按钮的ID绑定:
    找到布局文件activity_display.xml中保存按钮的实际ID(比如界面上的Save按钮对应的ID应为btnSave),修改DisplayActivity中的代码:

    // 保存按钮的事件处理器,修正ID为布局中对应的按钮ID
    Button saveBtn = (Button) findViewById(R.id.btnSave);
    saveBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            writeToFile(outputString);
        }
    });
    
  2. 优化数据传递方式:
    避免直接访问MainActivity的静态变量,改用Intent传递的Extra获取数据,防止状态异常:

    // 在DisplayActivity的onCreate中替换原数组获取代码
    int[] NumbersCalled = getIntent().getIntArrayExtra("NumbersCalled");
    if (NumbersCalled == null) {
        NumbersCalled = new int[0]; // 处理空指针情况
    }
    
  3. 简化文件写入代码:
    使用try-with-resources自动关闭流,减少冗余代码和异常遗漏:

    protected void writeToFile(String data) {
        try (FileOutputStream file = openFileOutput(BINGO_HISTORY_FILE, MODE_PRIVATE);
             OutputStreamWriter osw = new OutputStreamWriter(file);
             BufferedWriter bw = new BufferedWriter(osw)) {
            bw.write(data);
            bw.newLine();
            Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(this, "保存失败", Toast.LENGTH_LONG).show();
        }
    }
    
  4. 修复MainActivity的重复号码检查逻辑:
    checkNumbersCalled方法未使用传入的参数n,改为检查传入的号码是否已存在:

    public boolean checkNumbersCalled(int n) {
        for (int num : NumbersCalled) {
            if (num == n) {
                return true;
            }
        }
        return false;
    }
    

内容的提问来源于stack exchange,提问作者PrimeBeat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 07:18:10