Android Studio中Bingo应用第二个页面按钮点击无响应求助
Bingo应用DisplayActivity按钮点击无响应问题修复
问题描述
开发一款三页面Bingo期末作业时,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),导致返回按钮的点击事件被覆盖,而界面上真正的保存按钮从未绑定点击事件;重复绑定同一个按钮的点击事件,进一步引发按钮响应异常。
修复方案
修正保存按钮的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); } });优化数据传递方式:
避免直接访问MainActivity的静态变量,改用Intent传递的Extra获取数据,防止状态异常:// 在DisplayActivity的onCreate中替换原数组获取代码 int[] NumbersCalled = getIntent().getIntArrayExtra("NumbersCalled"); if (NumbersCalled == null) { NumbersCalled = new int[0]; // 处理空指针情况 }简化文件写入代码:
使用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(); } }修复MainActivity的重复号码检查逻辑:
checkNumbersCalled方法未使用传入的参数n,改为检查传入的号码是否已存在:public boolean checkNumbersCalled(int n) { for (int num : NumbersCalled) { if (num == n) { return true; } } return false; }
内容的提问来源于stack exchange,提问作者PrimeBeat
相关产品推荐
相关产品推荐

