首页 > 解决方案 > 单击 Button-java.lang.IllegalStateException 后应用程序崩溃:无法执行 android:onClick 的方法

问题描述

所以,我正在开发一个类似于井字游戏的应用程序。我已经分配了一个按钮,单击该按钮将再次开始游戏。但是每当我点击它时,我都会得到java.lang.IllegalStateException: Could not execute method for android:onClick

错误

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.connect3, PID: 10838
    java.lang.IllegalStateException: Could not execute method for android:onClick
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:390)
        at android.view.View.performClick(View.java:6256)
        at android.view.View$PerformClick.run(View.java:24701)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
        at android.view.View.performClick(View.java:6256) 
        at android.view.View$PerformClick.run(View.java:24701) 
        at android.os.Handler.handleCallback(Handler.java:789) 
        at android.os.Handler.dispatchMessage(Handler.java:98) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6541) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 
     Caused by: java.lang.ClassCastException: androidx.gridlayout.widget.GridLayout cannot be cast to android.widget.GridLayout
        at com.example.connect3.MainActivity.playAgain(MainActivity.java:82)
        at java.lang.reflect.Method.invoke(Native Method) 
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385) 
        at android.view.View.performClick(View.java:6256) 
        at android.view.View$PerformClick.run(View.java:24701) 
        at android.os.Handler.handleCallback(Handler.java:789) 
        at android.os.Handler.dispatchMessage(Handler.java:98) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6541) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 
Disconnected from the target VM, address: 'localhost:8600', transport: 'socket'

MainActivity.java

package com.example.connect3;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.View;
import android.widget.GridLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    int aplayer=0;
    //0=zero, 1= cross


    int[] gameState = {2,2,2,2,2,2,2,2,2};

    int[][] winingPositions = {{0,1,2},{3,4,5},{6,7,8},{0,3,6},{1,4,7},{2,5,8},{0,4,8},{2,4,6}};

    @SuppressLint("SetTextI18n")
    public void dropIn (View view)
    {
        ImageView counter = (ImageView) view;


        int tappedCounter = Integer.parseInt(counter.getTag().toString());

        if (gameState[tappedCounter] == 2) {

            gameState[tappedCounter] = aplayer;

            counter.setTranslationY(-1000f);

            if (aplayer == 0) {
                counter.setImageResource(R.drawable.zero);
                aplayer = 1;
            } else {
                counter.setImageResource(R.drawable.cross);
                aplayer = 0;
            }

            counter.animate().translationYBy(1000f).setDuration(300);

            for (int[] winingPosition : winingPositions)
            {
                if (gameState[winingPosition[0]] == gameState[winingPosition[1]] && gameState[winingPosition[1]] == gameState[winingPosition[2]] && gameState[winingPosition[0]] != 2)
                {
                    String winner= " Cross";
                    if (gameState[winingPosition[0]] == 0)
                    {
                     winner="Zero";
                    }

                    //someone has won

                    TextView winMsg = (TextView) findViewById(R.id.winMsg);
                    winMsg.setText(winner + " has WON!!");

                    LinearLayout layout = (LinearLayout) findViewById(R.id.playAgainlayout);
                    layout.setVisibility(View.VISIBLE);
                }

            }
        }
    }

    public void playAgain(View view)
    {


        LinearLayout layout = (LinearLayout) findViewById(R.id.playAgainlayout);
        layout.setVisibility((View.INVISIBLE));

        aplayer=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);

        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

日志猫

标签: javaandroidandroid-studioonclick

解决方案


该错误已通过更改 import android.widget.gridLayout; 为 解决import androidx.gridlayout.widget.GridLayout;


推荐阅读