java - 无法执行 android:onClick 的方法,原因是:java.lang.reflect.InvocationTargetException
问题描述
我正在开发一个名为 connect3 的项目,这是一个游戏,我试图显示再次播放按钮,如果有人获胜,他可以重新开始游戏,但每当我再次点击 plag 时,我的应用程序就会崩溃。
// 0 = yellow, 1 = red
int activePlayer = 0;
boolean gameIsActive = true;
// 2 means unplayed
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}};
public void dropIn(View view) {
ImageView counter = (ImageView) view;
int tappedCounter = Integer.parseInt(counter.getTag().toString());
if (gameState[tappedCounter] == 2 && gameIsActive) {
gameState[tappedCounter] = activePlayer;
counter.setTranslationY(-1000f);
if (activePlayer == 0) {
counter.setImageResource(R.drawable.yellow);
activePlayer = 1;
} else {
counter.setImageResource(R.drawable.red);
activePlayer = 0;
}
counter.animate().translationYBy(1000f).rotation(360).setDuration(300);
for (int[] winningPosition : winningPositions) {
if (gameState[winningPosition[0]] == gameState[winningPosition[1]] &&
gameState[winningPosition[1]] == gameState[winningPosition[2]] &&
gameState[winningPosition[0]] != 2) {
// Someone has won!
gameIsActive = false;
String winner = "Red";
if (gameState[winningPosition[0]] == 0) {
winner = "Yellow";
}
TextView winnerMessage = (TextView) findViewById(R.id.winnerMessage);
winnerMessage.setText(winner + " has won!");
LinearLayout layout = (LinearLayout) findViewById(R.id.playAgainLayout);
layout.setVisibility(View.VISIBLE);
} else {
boolean gameIsOver = true;
for (int counterState : gameState) {
if (counterState == 2) gameIsOver = false;
}
if (gameIsOver) {
TextView winnerMessage = (TextView) findViewById(R.id.winnerMessage);
winnerMessage.setText("It's a draw");
LinearLayout layout = (LinearLayout) findViewById(R.id.playAgainLayout);
layout.setVisibility(View.VISIBLE);
}
}
}
}
}
public void playAgain(View view) {
gameIsActive = true;
LinearLayout layout = (LinearLayout) findViewById(R.id.playAgainLayout);
layout.setVisibility(View.INVISIBLE);
activePlayer = 0;
for (int i = 0; i < gameState.length; i++) {
gameState[i] = 2;
}
GridLayout gridLayout = (GridLayout) findViewById(R.id.gridLayout);
for (int i = 0; i < gridLayout.getChildCount(); i++) {
((ImageView) gridLayout.getChildAt(i)).setImageResource(0);
}
}
基本上,当用户单击“再次播放”按钮时,该应用程序应该重新开始游戏,但是每当我单击它时,它显示 onClick 未执行,我应该做些什么来帮助我。
这是我得到的错误
2021-09-16 11:58:58.690 25827-25827/com.example.android.connect3 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.android.connect3, PID: 25827
java.lang.IllegalStateException: Could not execute method for android:onClick
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:414)
at android.view.View.performClick(View.java:6659)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
at android.view.View.performClickInternal(View.java:6631)
at android.view.View.access$3100(View.java:790)
at android.view.View$PerformClick.run(View.java:26187)
at android.os.Handler.handleCallback(Handler.java:907)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7625)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
at android.view.View.performClick(View.java:6659)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
at android.view.View.performClickInternal(View.java:6631)
at android.view.View.access$3100(View.java:790)
at android.view.View$PerformClick.run(View.java:26187)
at android.os.Handler.handleCallback(Handler.java:907)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7625)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
Caused by: java.lang.ClassCastException: androidx.gridlayout.widget.GridLayout cannot be cast to android.widget.GridLayout
at com.example.android.connect3.MainActivity.playAgain(MainActivity.java:133)
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
at android.view.View.performClick(View.java:6659)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
at android.view.View.performClickInternal(View.java:6631)
at android.view.View.access$3100(View.java:790)
at android.view.View$PerformClick.run(View.java:26187)
at android.os.Handler.handleCallback(Handler.java:907)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7625)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
解决方案
您的 logcat 中的行Caused by: java.lang.ClassCastException: androidx.gridlayout.widget.GridLayout cannot be cast to android.widget.GridLayout
表示您使用了错误的 import 。在这里,当在 playAgain 方法中初始化 GridLayout 时,GridLayout gridLayout = (GridLayout) findViewById(R.id.gridLayout);
您使用了两个不同的 GridLayout 类,一个是 androidx 库,另一个是以前的版本。您需要确保您拥有两个androidX
库的导入(因为它当前受支持)。删除导入并重新导入它们。确保你只androidx.gridlayout.widget.GridLayout
在你的进口中而不是android.widget.GridLayout
推荐阅读
- python - 在 Altair (Python) 中标记分层图表
- r - 如何根据R中的列名绘制一行
- javascript - 如何选择一个随机变量,然后从变量列表中选择一个随机变量?
- ios - 无法为模拟器构建应用程序。在 iPhone 11 Pro Max 上启动应用程序时出错
- android - 材质组件默认为 colorAccent 而不是 colorPrimary
- html - 导航栏切换器处于固定位置
- python - 在 ubuntu 18.04 上为 python 3.7.5 安装 mysqclient 时出错
- c - 如何在c中删除链表中的头?
- python - 使用 os.walk() 将目录中的所有 .txt 文件移动到新文件夹?
- go - 如何在 JSON 响应中包含来自 MongoDB 的 ObjectID 键?