java - 每次我使用“再次播放”按钮时,我的井字游戏应用程序都会崩溃
问题描述
我正在做一个井字游戏。我的应用程序第一次运行良好。但是当我再次尝试播放按钮时它崩溃了。它具有名为 playagain 的 onclick 方法,允许用户在完成一个新游戏后开始一个新游戏。
从日志看来,gridlayout的初始化有问题。我该如何解决?
'''
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
int turn = 0;
int flag = 0;
int[] filledIn = {2, 2, 2, 2, 2, 2, 2, 2, 2};
int[][] winningPos = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}, {0, 3, 6}, {1, 4, 7}, {2, 5, 8}, {0, 4, 8}, {2, 4, 6}};
public void ontap(View view) {
ImageView image = (ImageView) view;
int t = Integer.parseInt( image.getTag().toString());
if (flag == 0 && filledIn[t] == 2) {
if (turn == 0) {
image.setImageResource(R.drawable.redcross);
filledIn[t] = turn;
turn = 1;
} else {
image.setImageResource(R.drawable.redcircle);
filledIn[t] = turn;
turn = 0;
}
for (int[] winPos : winningPos) {
if (filledIn[winPos[0]] == filledIn[winPos[1]] && filledIn[winPos[0]] == filledIn[winPos[2]] && filledIn[winPos[0]] != 2) {
flag = 1;
Button button = (Button) findViewById(R.id.button);
TextView textView = (TextView) findViewById(R.id.textView);
String message = "";
if (turn == 1) {
message = "Player 1 has won !";
}
if (turn == 0) {
message = "player 2 has won !";
}
textView.setText(message);
textView.setVisibility(View.VISIBLE);
button.setVisibility(View.VISIBLE);
}
}
}
}
public void playagain(View view) {
Button button = (Button) findViewById(R.id.button);
TextView textView = (TextView) findViewById(R.id.textView);
Log.i("info1","initialized");
button.setVisibility(View.INVISIBLE);
textView.setVisibility(View.INVISIBLE);
Log.i("invisibility","set to invisible");
GridLayout grid = (GridLayout) findViewById(R.id.grid);## Heading ##
Log.i("info6","all fine");
for (int i = 0; i < grid.getChildCount(); i++) {
Log.i("info3","all good");
ImageView image = (ImageView) grid.getChildAt(i);
Log.i("info4","all ok");
image.setImageDrawable(null);
Log.i("info5","all fine");
}
Log.i("info2","images removed");
for (int i = 0;i<9;i++)
{
filledIn[i]=2;
}
flag =0;
turn=0;
}
日志:
com.example.tictactoe3 I/invisibility: set to invisible
2020-03-23 15:07:47.168 8370-8370/com.example.tictactoe3 D/AndroidRuntime: Shutting down VM
2020-03-23 15:07:47.177 8370-8370/com.example.tictactoe3 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.tictactoe3, PID: 8370
java.lang.IllegalStateException: Could not execute method for android:onClick
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:402)
at android.view.View.performClick(View.java:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397)
at android.view.View.performClick(View.java:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.ClassCastException: androidx.gridlayout.widget.GridLayout cannot be cast to android.widget.GridLayout
at com.example.tictactoe3.MainActivity.playagain(MainActivity.java:79)
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397)
at android.view.View.performClick(View.java:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
解决方案
您不能将“androidx.gridlayout.widget.GridLayout”转换为“android.widget.GridLayout”。导入“androidx.gridlayout.widget.GridLayout;” 在“XYZ.java”中。
推荐阅读
- php - 如何在 firebase-php 中获取失败的令牌?
- java - JavaFX - 如何使用 Java 代码更改选定 TableColumn 的颜色?
- java - 如何在 Java 中设置 SQL Server 数据库连接超时和查询超时
- azure - 使用 azure 应用程序网关 V2 来自网站的多个登录提示
- javascript - 调用函数时得到未定义的结果
- ios - Firebase动态链接未打开应用程序iOS 14
- javascript - 通过 d3.js 创建的世界地图中的工具提示
- r - group_split 的输出需要保存为单独的数据框
- javascript - 对 Angularjs Gridster 的辅助功能支持
- azure-devops - Azure 管道检查时间