Android Studio开发井字棋点击Play Again按钮应用闪退求助
问题根源
点击Play Again按钮闪退是**类型转换异常(ClassCastException)**导致的:
- Java代码中导入的是原生
android.widget.GridLayout - XML布局里使用的是AndroidX的
androidx.gridlayout.widget.GridLayout - 在
okayPlay方法中强转GridLayout时类型不匹配,直接触发崩溃
修复方法
步骤1:修改MainActivity.java的导入语句
把原有导入的GridLayout替换为AndroidX版本:
// 删掉原有 import android.widget.GridLayout; import androidx.gridlayout.widget.GridLayout;
步骤2:可选优化建议
将GridLayout、Play Again按钮、获胜提示TextView改为全局变量,仅在onCreate中初始化一次,减少重复查找控件的开销,修正后的完整代码参考:
package com.example.tictac; import androidx.appcompat.app.AppCompatActivity; import androidx.gridlayout.widget.GridLayout; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; public class MainActivity extends AppCompatActivity { //0:cross,1:red,2:empty int[] gameState = {2,2,2,2,2,2,2,2,2}; int[][] winningPositions = {{0,1,2},{3,4,5},{6,7,8},{0,3,6},{1,4,7},{2,5,8},{0,4,8},{2,4,6}}; int activePlayer =0; boolean gameActive = true; // 全局控件变量 GridLayout gridLayout; Button playAgainButton; TextView winnerTextView; public void dropIn(View view){ ImageView counter = (ImageView) view; int tappedCounter = Integer.parseInt(counter.getTag().toString()); if(gameState[tappedCounter] == 2 && gameActive) { gameState[tappedCounter] = activePlayer; counter.setTranslationY(-1500); if (activePlayer == 0) { counter.setImageResource(R.drawable.cross); activePlayer = 1; } else { counter.setImageResource(R.drawable.redd); activePlayer = 0; } counter.animate().translationYBy(1500).rotation(3600).setDuration(300); for (int[] winningPosition : winningPositions) { if (gameState[winningPosition[0]] == gameState[winningPosition[1]] && gameState[winningPosition[1]] == gameState[winningPosition[2]] && gameState[winningPosition[0]] != 2) { //someone win gameActive = false; String winner = ""; if (activePlayer == 1) { winner = "Black"; } else { winner = "Red"; } winnerTextView.setText(winner + " has won"); playAgainButton.setVisibility(View.VISIBLE); winnerTextView.setVisibility(View.VISIBLE); } } } } public void okayPlay(View view){ playAgainButton.setVisibility(View.INVISIBLE); winnerTextView.setVisibility(View.INVISIBLE); for(int i=0; i<gridLayout.getChildCount() ;i++){ ImageView counter =(ImageView) gridLayout.getChildAt(i); counter.setImageDrawable(null); } for(int i=0;i<gameState.length;i++){ gameState[i]=2; } activePlayer =0; gameActive = true; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化全局控件 gridLayout = findViewById(R.id.gridLayout); playAgainButton = findViewById(R.id.playAgainButton); winnerTextView = findViewById(R.id.winnerTextView); } }
修改完成后重新编译运行即可解决闪退问题,游戏状态会正常重置。
内容的提问来源于stack exchange,提问作者Rachana Velore
相关产品推荐
相关产品推荐

