首页 > 解决方案 > 无法执行 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) 

标签: javaandroidonclickcrash

解决方案


您的 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


推荐阅读