Arresto anomalo dell'app dopo aver fatto clic su Button- java.lang.IllegalStateException: Impossibile eseguire il metodo per Android: onClick

Aug 20 2020

Quindi, sto lavorando a un'app simile a TicTacToe. Ho assegnato un pulsante che, una volta cliccato, riavvierà il gioco. Ma ogni volta che clicco ottengojava.lang.IllegalStateException: Could not execute method for android:onClick

Errore

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);
    }
}

Logcat

Risposte

1 PrithinBabu Aug 20 2020 at 23:16

L'errore è stato risolto cambiando import android.widget.gridLayout;inimport androidx.gridlayout.widget.GridLayout;

CodeIsLaw Aug 20 2020 at 21:56

Non hai condiviso il tuo file .xml, ma penso che il tuo metodo onClick manchi lì, devi aggiungerlo. Devi dare al tuo pulsante un metodo onClick nel suo file .xml come questo:

<Button
<!-- other stuff here -->
 android:onClick="buttonClick"/>

Quindi devi chiamare questo metodo onClick nella tua attività .java in questo modo:

public void buttonClick(View v){

       //do the stuff here
    }
ArkaMazumder Aug 20 2020 at 22:27
public class MainActivity extends AppCompatActivity {
    //0=Yellow,1=Red,;
    int activePlayer = 0;
    int gameState[] = {2, 2, 2, 2, 2, 2, 2, 2, 2};
    int count=0;
    int winingPositions[][] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}, {0, 3, 6}, {1, 4, 7}, {2, 5, 8}, {0, 4, 8}, {6, 4, 2}}; // Winning position.
    boolean gameOn = true;


    public void dropIn(View x) {

        Button press = (Button) findViewById(R.id.button);
        TextView text = (TextView) findViewById(R.id.textView2);
        for (int i = 0; i < gameState.length; i++)
        {
            if (gameState[i] == 2)


            {
                count++;
            }
        }
            if(count==1)
            {
                text.setText( "NO ONE HAS WON");
                text.setVisibility(View.VISIBLE);
                press.setVisibility(View.VISIBLE);



            }
            else
            {
                count=0;
            }

                     ImageView counter = (ImageView) x;
                     int tapCounter = Integer.parseInt(counter.getTag().toString());       //geting the tap value from the image.


                     if (gameState[tapCounter] == 2 && gameOn) {
                         counter.setTranslationY(-1500);                                     //vanishing the image


                         gameState[tapCounter] = activePlayer;


                         if (activePlayer == 0) {
                             counter.setImageResource(R.drawable.yellow);
                             counter.animate().translationYBy(1500).rotation(3600).setDuration(300);
                             activePlayer = 1;
                         } else {
                             counter.setImageResource(R.drawable.red);
                             counter.animate().translationYBy(1500).rotation(3600).setDuration(300);
                             activePlayer = 0;
                         }
                         for (int y[] : winingPositions) {
                             if (gameState[y[0]] == gameState[y[1]] && gameState[y[1]] == gameState[y[2]] && gameState[y[0]] != 2)
                             {
                                 gameOn = false;
                                 String winner = "";
                                 if (gameState[y[0]] == 1) {
                                     winner = "RED";
                                 } else {
                                     winner = "YELLOW";
                                 }

                                 text.setText(winner + "\tHAS WON");
                                 text.setVisibility(View.VISIBLE);
                                 press.setVisibility(View.VISIBLE);


                             }


                         }

                     }



                 }


  public void playAgain(View v)
    {
        Button press = (Button) findViewById(R.id.button);
        TextView text = (TextView) findViewById(R.id.textView2);
        text.setVisibility(View.INVISIBLE);
        press.setVisibility(View.INVISIBLE);
        androidx.gridlayout.widget.GridLayout g = (androidx.gridlayout.widget.GridLayout) findViewById(R.id.gridLayout1);

        for (int i = 0; i < g.getChildCount(); i++) {
            ImageView child = (ImageView) g.getChildAt(i);
            child.setImageDrawable(null);

        }
        for(int i=0;i<gameState.length;i++)
        {
            gameState[i]=2;

        }
         activePlayer = 0;




        gameOn = true;
    }



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

Puoi controllare il mio codice per Tic Tac Toe da qui.https://github.com/Jarvis-byte/3T_Application.git