Сбой приложения после нажатия кнопки - java.lang.IllegalStateException: не удалось выполнить метод для Android: onClick
Итак, я работаю над приложением, похожим на TicTacToe. Я назначил кнопку, при нажатии на которую игра снова запускается. Но всякий раз, когда я нажимаю на это, я получаю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);
}
}
Logcat
Ответы
Ошибка была решена изменением import android.widget.gridLayout;
наimport androidx.gridlayout.widget.GridLayout;
Вы не поделились своим XML-файлом, но я думаю, что ваш метод onClick там отсутствует, вам нужно его добавить. Вам нужно предоставить вашей кнопке метод onClick в его XML-файле следующим образом:
<Button
<!-- other stuff here -->
android:onClick="buttonClick"/>
Затем вам нужно вызвать этот метод onClick в своей .java Activity следующим образом:
public void buttonClick(View v){
//do the stuff here
}
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);
}
}
Вы можете проверить мой код для Tic Tac Toe здесь. https://github.com/Jarvis-byte/3T_Application.git